【发布时间】:2018-08-12 18:57:26
【问题描述】:
我有一个非常大的文本文件(~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.
我正在编写一个读取另一个文件的 PERL 程序, 该文件的 foreach 行(其中必须包含一个数字), 在大文件中搜索该数字减去 1 的 S 值, 然后分析该块属于该S值的数据行。
问题是,文本文件很大,所以要处理每一行
foreach $line {...} loop
很慢。由于 S=value 是严格递增的,有什么方法可以跳转到所需 S 值的特定行吗?
【问题讨论】:
-
改用
while。如果这是不行的,请将一定大小的 MB 读入缓冲区并计算换行符以找到所需的行。 -
每条记录的BYTES数是否相同?
-
你需要在一个文件中找到很多这些 S 值(来分析它们的文本),还是不需要那么多?
-
您可以使用 S-value/filepos 在该文件上创建一个索引,查找(二进制搜索)索引中的值,然后 seek() 到该文件位置。如果没有索引,您可以直接在文件中进行某种二进制搜索 - 即 seek() 到文件的一半,从该位置扫描第一个 S,并不断重复直到到达 S。这将需要多次文件读取( log n) 使用索引时只需要读入一次大文件。两种解决方案都几乎不会为大文件使用任何内存(第一个解决方案中只有索引的大小,第二个解决方案根本没有)。
-
文件有变化吗?如果没有,请将其转换为更好的格式。