如何高效地打开30gb的文件并处理其中的部分而不减慢速度?

2024-04-24 20:17:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的文件(超过30gb),里面有一些我需要计算的信息,比如平均值。我提到的片段是文件的片段,我知道每个片段的起始行号和后续行数。你知道吗

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

然而,随着时间的推移进程越来越慢,甚至切片的大小也或多或少的相同。 前1k片-1小时加工 第二个1k切片-4小时处理 第三个1k切片-8小时加工 第二个1k切片-17小时处理 我等了好几天才能完成这个过程。你知道吗

现在我在Windows10机器上做这个,1tb ssd,32GB ram。以前我也在linux机器(Ubuntu18.4)上尝试过250GBSSD和8GBRAM+8GBvirtualRAM。两者的结果大致相同。你知道吗

我注意到,在windows中,17%的CPU和11%的内存被占用,但磁盘使用率是100%。我不完全知道diskusage意味着什么以及如何改进它。你知道吗

作为代码的一部分,我在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

所以我想知道是否有办法提高处理时间。我假设我的代码从一开始就为每个片段读取整个文件,并且从文件的末尾读取时间会越来越长。你知道吗

值得注意的是,由于时间的限制,我从必须首先处理的最重要的部分开始。所以剩下的将是更多的随机切片的文件。所以解决方案应该适用于随机切片,如果有(我希望)。你知道吗

我没有经验,所以请原谅我,如果我问一个愚蠢的问题,但我真的找不到任何答案。你知道吗


Tags: 文件代码机器idsdataframe字典时间segment
1条回答
网友
1楼 · 发布于 2024-04-24 20:17:06

我想到了几件事。你知道吗

首先,如果您将数据放入数据帧中,则有一个“chunksize”参数用于导入大数据。它允许您处理/转储您需要/不需要的内容,同时提供df.describe等信息,这些信息将为您提供摘要统计信息。你知道吗

另外,我还听到了关于dask的好消息。它是一个可扩展的平台,通过并行、多核、多机处理,几乎和使用pandas和numpy一样简单,只需要很少的资源管理。你知道吗

相关问题 更多 >