2010-07-23 3 views
2

У меня есть 1 ГБ файл таблиц с данными, разделенными столбцами. Я проанализировал его и сохранил в хэш. Позже я использую этот хэш для дальнейшей работы. Но при разработке моего кода каждый раз, когда я компилирую для тестирования, выполняется «разбор и хранение в хэш», что делает мою программу медленной.Хранение хеша в памяти

Есть ли способ, где я могу хранить его, так что мне не нужно его компилировать снова и снова.

ответ

2

Не совсем. Эта информация должна каким-то образом загружаться в память. Тем не менее сериализация хеш-объекта на диске может помочь, поскольку десериализация, вероятно, быстрее, чем ваш код.

Вы можете найти freeze или check wikipedia on Serialization для получения дополнительных советов.

Заканчивать perl documentation for FreezeThaw:

use FreezeThaw qw(freeze thaw cmpStr safeFreeze cmpStrHard); 
$string = freeze $data1, $data2, $data3; 
... 
($olddata1, $olddata2, $olddata3) = thaw $string; 
if (cmpStr($olddata2,$data2) == 0) {print "OK!"} 

Все, что вам нужно сделать сейчас, это магазин $string в файле один раз разобранной, читать и thaw его!

+5

['Storable'] (http://p3rl.org/Storable) находится в ядре и более широко используется, чем' FreezeThaw'. – daxim

+0

Извините. Прошло десять лет с тех пор, как я последний раз занимался Perl. Я немного ржавый и не уверен, как это работает больше ... Но мне очень нравятся имена функций 'freeze' и' thaw'. –

0

Данные на Perl не хранятся очень эффективным образом. В худшем случае это может занять до десятков (20-80) раз больше памяти. Обратите внимание, что это может произойти только в худшем случае. Если это произойдет с вашим набором данных 1 ГБ, вы должны заметить. Поэтому я думаю, что это не твое дело. Структуры данных Perl очень быстрые, они часто используют память для скорости. Если объем памяти в вашем случае является разумным, вы можете справиться с этим и использовать прямой подход recommended по Daren Thomas или, скорее всего, Storable, рекомендованный daxim.

Если вы измеряете, что потребление памяти в вашем корпусе слишком велико, вы можете пойти с некоторым встроенным хранилищем ключей/значений. Если вы не будете изменять данные после загрузки, вы можете использовать CDB_File, который немного быстрее, чем BerkeleyDB, но последний позволяет вам изменять данные на лету. Вы можете выбрать позже и потому, что это более распространенное и гибкое решение.

Смежные вопросы