如何有效地打开30gb文件并处理它的部分而不会减慢速度?

问题描述 投票:5回答:1

我有一些大文件(超过30GB),其中包含我需要进行一些计算的信息,比如平均。我提到的部分是文件切片,我知道每个切片的起始行号和后续行的计数。

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

然而,在时间过程变得越来越慢,甚至切片的大小或多或少相同。第一个1k切片 - 在1小时内处理第二个1k切片 - 在4小时内处理第三个1k切片 - 在8小时内处理第二个1k切片 - 在17小时内处理我等待几天完成这些过程。

现在我在Windows 10机器上执行此操作,1tb ssd,32 GB内存。以前我也尝试过使用250gb ssd和8gb ram + 8gb虚拟内存的linux机器(ubuntu 18.4)。两者都或多或少相同。

我在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

所以我想知道是否有办法改善处理时间。我想我的代码从每个切片的开头读取整个文件,并且在文件结束时读取时间越来越长。

作为一个注释,由于时间的限制,我从最先处理的最重要的切片开始。所以其余的将是文件上更随机的切片。所以解决方案应该适用于随机切片,如果有的话(我希望)。

我没有编写脚本的经验,所以如果我问一个愚蠢的问题,请原谅我,但我真的找不到任何答案。

python pandas bigdata large-data large-files
1个回答
0
投票

有几件事情浮现在脑海中。

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

此外,我听到有关dask的好消息。它是一个可扩展的平台,通过并行,多核,多机器处理,几乎就像使用pandas和numpy一样简单,只需很少的资源管理。

© www.soinside.com 2019 - 2024. All rights reserved.