PERL:跳转到一个巨大的文本文件中的行

Nis*_*ssa 3 perl bigdata

我有一个非常大的文本文件(~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值的特定行?

Sch*_*ern 9

有没有什么方法可以跳转到所需S值的特定行?

是的,如果文件没有改变,那么创建一个索引.这需要完整地读取文件一次并注意使用的所有S=#行的位置tell.将其存储在DBM文件中,其中键是数字,值是文件中的字节位置.然后你可以seek用来跳转到文件中的那一点并从那里读取.

但是,如果您要这样做,最好将数据导出到适当的数据库,例如SQLite.编写程序将数据插入数据库并添加普通的SQL索引.这可能比编写索引更简单.然后,您可以使用普通SQL有效地查询数据,并进行复杂查询.如果文件更改,您可以重做导出,或使用普通insertupdateSQL更新数据库.对于任何了解SQL的人来说,这都很容易,而不是一堆自定义索引和搜索代码.