如何有效打开30gb文件并对其进行处理而又不减慢速度?

E.E*_*gin 5 python large-files large-data bigdata pandas

我有一些大文件(超过30gb),其中包含一些信息,我需要对这些信息进行一些计算,例如求平均值。我提到的片段是文件的片段,而且我知道每个片段的起始行号和后续行数。

因此,我有一本字典,其中的键作为起始行号,而值作为后续行的计数,并且我使用该字典来循环遍历文件并获取切片。对于每个切片,我创建一个表,进行一些转换和平均,创建一个新表并将其转换为字典。我使用islice进行切片,并使用pandas dataframe从每个切片创建表。

但是,随着时间的流逝,速度越来越慢,甚至片的大小也差不多。第一个1k切片-在1h中处理第二个1k切片-在4h中处理第三个1k切片-在8h中处理第二个1k切片-在17h中处理我正在等待几天以完成流程。

现在,我正在Windows 10计算机,1TB SSD,32 GB内存上执行此操作。以前,我还在带250gb ssd和8gb ram + 8gb虚拟ram的linux机器(ubuntu 18.4)上尝试过。两者的结果大致相同。

我在Windows中注意到,正在使用17%的CPU和11%的内存,但是磁盘使用率是100%。我不完全了解磁盘使用的含义以及如何改进它。

作为代码的一部分,我还在Linux上工作时将数据导入到mongodb中,我想可能是因为在mongodb中建立了索引。但是当我打印处理时间和导入时间时,我注意到几乎所有时间都花在处理上,导入需要几秒钟。
为了节省时间,我现在在功能更强大的Windows计算机上进行处理,并将文档作为txt文件编写。我希望在磁盘上写入会稍微减慢该过程,但txt文件大小不会超过600kb。

以下是一段代码,我如何读取文件:

with open(infile) as inp:
    for i in range(0,len(seg_ids)): 
        inp.seek(0)
        segment_slice = islice(inp,list(seg_ids.keys())[i], (list(seg_ids.keys())[i]+list(seg_ids.values())[i]+1)) 
        segment = list(segment_slice)

        for _, line in enumerate(segment[1:]):
            #create dataframe and perform calculations
Run Code Online (Sandbox Code Playgroud)

因此,我想了解是否有一种方法可以缩短处理时间。我想我的代码从每个切片的开始读取整个文件,并且直到文件结束为止,读取时间越来越长。

注意,由于时间限制,我从必须首先处理的最重要的片段开始。因此,其余部分将是文件上的更多随机切片。因此,解决方案应该适用于随机切片(如果有)(我希望)。

我没有脚本编写方面的经验,因此,如果我提出一个愚蠢的问题,请原谅我,但我确实找不到任何答案。

小智 1

我想到了一些事情。

首先,如果将数据导入 pandas DataFrame,则会有一个用于导入大数据的“chunksize”参数。它允许您处理/转储您需要/不需要的内容,同时提供诸如哪些信息df.describe可以为您提供摘要统计信息。

另外,我听说了有关dask的好消息。它是一个通过并行、多核、多机处理实现的可扩展平台,几乎与使用 pandas 和 numpy 一样简单,几乎不需要管理资源。