2010-11-02 2 views
0

У меня есть ~ 200K именованных свойств и ~ 25K файлов. Я извлекаю, сохраняются ли свойства или нет для каждого файла, используя Python, как набор свойств, которые хранятся, по одному для каждого файла.Hash + mapping или index + mapping для конденсирования использования строк

Чтобы сделать это извлечение, я могу запустить сотни отдельных сценариев извлечения python на вычислительной ферме параллельно. Каждый из них оставляет за собой некоторое представление набора извлечения из каждого из файлов.

Дополнительная обработка включает в себя чтение этих наборов 20K и работу с накопленными данными. для создания отчета об этом наборе файлов/свойств.

Одна из проблем, которые есть у меня, заключается в том, что если я сохраню извлеченный набор как текст, то длинные строки имен свойств и строки имен файлов будут повторяться, теряя пространство на диске и увеличивая время синтаксического анализа.

Я думал создать центральный индекс отсортированных имен свойств и просто сохранить индекс - то же самое для имен файлов, как, вероятно, файлы .py для импорта.

Альтернативой использованию индекса в отсортированном списке имен является использование str. hash() значение как индекс, который будет означать, вероятно, более быструю обработку, но меня беспокоит возможность двух неравных строк, заканчивающихся тем же hash() значение. Может ли это случиться?

Я бы использовал ту же исполняемую версию Python и версию ОС на всех машинах.

ответ

2

Знаете ли вы недвижимость заранее? Если вы это сделаете, вы можете рассмотреть Perfect hashing (то есть вы можете распространять настройки хэша вместо полного списка свойств/файлов).

Очень грубый (но возможно рабочий путь) имел бы несколько разных хеш-функций (h1, h2 ...); начало, например. с str.hash() и вычислить хеши. Если есть столкновения, попробуйте использовать кортеж (h1 (свойство), h2 (свойство)) как хэш. Если есть еще столкновения, используйте (h1 (свойство), h2 (свойство), h3 (свойство)) и т. Д., Пока не произойдет столкновений. Функции h_x могут быть фактически конфигурируемой функцией, и рекомендуется использовать некоторые случайные хеш-функции.

Однако мне кажется, что это может быть излишним, просто распределяя список файлов/свойства могут быть намного проще ...

+0

Вся точка хэша что вы вычисляете его из значения, и хэш для заданного значения никогда не изменяется. Вы не можете просто изменять хэш, пока он не столкнется. –

+0

Вы можете продолжать изменять хэш-функцию до тех пор, пока значения, которые вы хешируете, никогда не сталкиваются, и только затем попросите все распределенные процессы использовать эту конкретную хэш-функцию. Это называется совершенным хэшированием; Я думаю, что это (или, по крайней мере, было) использовано в некоторых компиляторах для разумного компиляции огромных «case» заявлений. – ondra

+0

Итак, дело доходит до идеального хэширования или использования индекса? Думаю, я закодирую их обоих и посмотрю, что лучше выглядит. – Paddy3118

0

Хеши могут сталкиваться. Вам придется это учитывать.

+0

Так что нет никакой волшебной пули :-) – Paddy3118