即时访问大文件中的行,无需加载文件
Posted
技术标签:
【中文标题】即时访问大文件中的行,无需加载文件【英文标题】:Instant access to line from a large file without loading the file 【发布时间】:2019-04-28 05:43:42 【问题描述】:在我最近的一个项目中,我需要执行这个简单的任务,但我不确定最有效的方法是什么。
我有几个大文本文件 (>5GB),我需要不断地从这些文件中提取随机行。要求是:我无法将文件加载到内存中,我需要非常高效地执行此操作(每秒 >>1000 行),并且最好我需要尽可能少地进行预处理。
文件由许多短行组成~(20 百万行)。 “原始”文件具有不同的行长度,但通过简短的预处理,我可以使所有行具有相同的长度(尽管,完美的解决方案不需要预处理)
我已经尝试过 here 提到的默认 python 解决方案,但是它们太慢了(并且 linecache 解决方案将文件加载到内存中,因此在这里不可用)
我想到的下一个解决方案是创建某种索引。我找到了this solution,但它已经过时了,所以它需要一些工作才能开始工作,即使这样我也不确定在处理索引文件期间产生的开销是否不会减慢进程的时间尺度上面的解决方案。
另一种解决方案是将文件转换为二进制文件,然后通过这种方式即时访问行。对于这个解决方案,我找不到任何支持二进制文本工作的 python 包,我觉得以这种方式创建一个强大的解析器可能需要很长时间,并且可能会因为小的计算错误而产生许多难以诊断的错误/错误。
我想到的最终解决方案是使用某种数据库(在我的例子中是 sqlite),这需要将行传输到数据库中并以这种方式加载它们。
注意:我每次还会加载数千条(随机)行,因此更适合成组行的解决方案将具有优势。
提前致谢,
艺术。
【问题讨论】:
我推荐 sqlite。非常适合这个问题,不需要安装。 正如 MEdwin 所说和您所提到的,我认为您最好的选择是将文件从文本文件更改为某种形式的 SQL 文件或 HDF5。如果你腌制它或其他东西,你可能可以更快地读取文件,但根据我的经验,这并没有太大的区别。 另一种可能的方法是寻找文件中的随机位置并向后/向前移动,直到可以隔离一行,然后重复... 【参考方案1】:正如 cmets 中所说,我相信使用 hdf5 将是一个不错的选择。 This 答案显示了如何读取那种文件
【讨论】:
以上是关于即时访问大文件中的行,无需加载文件的主要内容,如果未能解决你的问题,请参考以下文章
计算非常大文件中的行数会导致 System OutofMemory 异常 [重复]