2010-07-23 118 views
2

我有1 GB的表格,其中有按列分隔的数据。我已经解析并存储在哈希中。 稍后我将使用这个散列表进行进一步的工作。但在开发我的代码时,我每次编译进行测试时,都会执行“解析并存储到哈希”,这会使我的程序变慢。将哈希存储在内存中

有没有什么方法可以存储它,以便我不需要一次又一次地编译它。

回答

2

不是。这些信息必须以某种方式加载到内存中。不过,将哈希对象序列化到磁盘可能会有所帮助,因为反序列化可能比您的代码更快。

你可以检查出freezecheck 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

['可存储'](http://p3rl.org/Storable)是核心,比'FreezeThaw'更广泛。 – daxim 2010-07-23 09:11:22

+0

对不起。自从我上次做Perl以来已经有十年了。我有点生疏,不知道它是如何工作的......但我真的很喜欢函数名称'freeze'和'thaw'。 – 2010-07-23 09:55:48

0

Perl中的数据没有以非常有效的方式存储。它可以在最坏的情况下多达数十(20-80)倍的内存。请注意,只有在最坏的情况下才会发生。如果它发生在你的1GB数据集中,你应该注意。所以我认为这不是你的情况。 Perl的数据结构非常快,它们通常为了速度而交换内存。如果你的情况的内存量是合理的,你可以解决它,并使用直线前进的Daren Thomas或更可能通过Storable推荐daxim接近recommended

如果你衡量你的情况内存消耗过大,你可以与一些嵌入式键/值存储去。如果您在加载后不修改数据,则可以使用比BerkeleyDB快一点的CDB_File,但后者允许您即时修改数据。您以后也可以选择,因为它是更为常见和灵活的解决方案。