我有一个非常大的文本文件(~4 GB).它具有以下结构:
S=1
3 lines of metadata of block where S=1
a number of lines of data of this block
S=2
3 lines of metadata of block where S=2
a number of lines of data of this block
S=4
3 lines of metadata of block where S=4
a number of lines of data of this block
etc.
Run Code Online (Sandbox Code Playgroud)
我正在写一个PERL程序,读取另一个文件,该文件的foreach行(它必须包含一个数字),在巨大的文件中搜索该数字的S值减去1,然后分析数据行.块属于该S值.
问题是,文本文件是巨大的,所以用一个处理每一行
foreach $line {...} loop
Run Code Online (Sandbox Code Playgroud)
非常慢 由于S =值严格增加,是否有任何方法可以跳转到所需S值的特定行?
有没有什么方法可以跳转到所需S值的特定行?
是的,如果文件没有改变,那么创建一个索引.这需要完整地读取文件一次并注意使用的所有S=#行的位置tell.将其存储在DBM文件中,其中键是数字,值是文件中的字节位置.然后你可以seek用来跳转到文件中的那一点并从那里读取.
但是,如果您要这样做,最好将数据导出到适当的数据库,例如SQLite.编写程序将数据插入数据库并添加普通的SQL索引.这可能比编写索引更简单.然后,您可以使用普通SQL有效地查询数据,并进行复杂查询.如果文件更改,您可以重做导出,或使用普通insert和updateSQL更新数据库.对于任何了解SQL的人来说,这都很容易,而不是一堆自定义索引和搜索代码.