Хранение в файле адреса и списка слов (+)

Bor-ka

Новичок
Хранение в файле адреса и списка слов (+)

Имеется некоторая текстовое значение с адресом документа + имеется некий список слов для документа.
Количество документов - от нескольких тысяч. Необходимо хранить адрес документа (текстовое значение),
слова (+ в последствии некий вес для каждого слова).

Прошу помочь по следующим вопросам:
1. Лучше хранить отдельно словарь, и отдельно адреса с индексами слов из словаря или все в одном?
2. Каким образом наиболее оптимально с точки зрения скорости работы и размера файлов хранить эти данные? Критично ко времени выполнения и объему RAM.
3. Данные хранить в оригинальном (текстовом) виде или обрабатывать какой либо хэш функцией? Если хэш, то какой лучше?

от хранения данных в БД отказался.

Что курить по этим вопросам?

Заранее благодарю за помощь.
 

Steamroller

Новичок
Хм, странная постановка задачи, обычно наоборот ключи и данные расположены. :)
1. Лучше хранить отдельно словарь, и отдельно адреса с индексами слов из словаря или все в одном?
Словарь - отдельно. Например, в виде Б-дерева на основе berkeley.
2. Каким образом наиболее оптимально с точки зрения скорости работы и размера файлов хранить эти данные? Критично ко времени выполнения и объему RAM.
А это зависит от того, какого рода операции со списками слов будут проводиться.
3. Данные хранить в оригинальном (текстовом) виде или обрабатывать какой либо хэш функцией? Если хэш, то какой лучше?
Хеши лучше хранить, в качестве функции например можно использовать md5 (отрубить от нее 64 бита).
Что курить по этим вопросам?
Ну видимо то что ты пытаешься сделать - уже кто-то до тебя делал, значит и искать литературу о том, как это делать.
 

Bor-ka

Новичок
> Хм, странная постановка задачи, обычно наоборот ключи и данные расположены.
Поясните, пожалуйста, как именно обычно располагаются данные и ключи

> Словарь - отдельно. Например, в виде Б-дерева на основе berkeley.
Спасибо, изучаю. надо будет еще их лицензию изучить.

>А это зависит от того, какого рода операции со списками слов будут проводиться.
необходимо выбрать записи, для которых есть все слова из определенного множества.
 

Steamroller

Новичок
необходимо выбрать записи, для которых есть все слова из определенного множества.
И как же при такой структуре это делать - получаем множество слов, затем открываем последовательно каждый из 10000 файлов, и смотрим - есть ли там каждое из этих слов? :))
 

Bor-ka

Новичок
Steamroller
причем тут 10000 файлов?

все индексируется и размещается в одном (или двух - словарь отдельно) файлах.
 

Steamroller

Новичок
Ага. То есть будет большой файл, в котором ты будешь хранить для каждого документа - список слов. И как ты собираешься получать множество нужных документов? Просмотром всех записей?
 

uliss

Новичок
Может поменять местами хранить слово => адрес(а) документа(ов)?

Искать-то нужно по словам, так?
 

Bor-ka

Новичок
Steamroller
вот об этом и думается, РСУБД не рассматривается.

> Искать-то нужно по словам, так?
да

> Может поменять местами хранить слово => адрес(а) документа(ов)?
поясните, пожалуйста
 

uliss

Новичок
Так создавай индекный файл со словами (нужными тебе), но для всех документов.

И в нем будет слово => адрес, адрес

Или используй dbm-базу
http://www.php.net/manual/ru/ref.dba.php
там хранятся пары key => value
 

uliss

Новичок
Тогда создай файл такого формата:

слово:адрес1:адрес2:

а потом обрабатывай его.

Но если файл будет очень большой то скорость поиска будет низкая :( - потому что поиск последовательный.

Так что если есть возможность используй СУБД
 

Bor-ka

Новичок
не хотелось создавать большую нагрузку на MySQL. Как по Вашему мнению наиболее оптимально хранить и проводить выборку для данной задачи?

Таблица слов + таблица документов + таблица соответствия документов словам?
 

Steamroller

Новичок
не хотелось создавать большую нагрузку на MySQL.
А если в файле хранить - то скорее всего будет тормозить и большую нагрузку на сервер создавать.
Таблица слов + таблица документов + таблица соответствия документов словам?
Ага, именно так.
 

Bor-ka

Новичок
если индекс по словам + слова хранить в виде хэша должно нормально работать
 

Bor-ka

Новичок
uliss
хотелось обрабатывать слова хэш функцией, брать 64 бита (как советовал Steamroller) и писать в таблицу. Место экономится, размер фиксированный.
 

Steamroller

Новичок
Bor-ka, вообще чтобы сэкономить на размере слова - хранишь отдельную таблицу слово - номер слова. Тогда на одно слово хватит 3 байта (16 млн. слов).
 
Сверху