gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:03:56 25 4
gpt4 key购买 nike

我有一些大文件(超过30gb),其中包含一些信息,我需要对这些信息进行一些计算,例如求平均值。我提到的片段是文件的片段,并且我知道每个片段的起始行号和后续行数。
因此,我有一本字典,其中的键作为起始行号,而值作为后续行的计数,并且我使用该字典在文件中循环并获取切片。对于每个切片,我创建一个表,进行一些转换和平均,创建一个新表,然后将其转换为字典。我使用islice进行切片,并使用pandas dataframe从每个切片创建表。
但是,随着时间的流逝,速度越来越慢,甚至片的大小或多或少都是一样的。
前1k片-在1h内处理
第二个1k片-在4小时内处理
第三个1k片-在8小时内处理
第二个1k片-在17小时内处理
我正在等待几天才能完成流程。
现在,我正在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
因此,我想了解是否有一种方法可以缩短处理时间。我想我的代码从每个切片的开始读取整个文件,并且直到文件结束为止,读取时间越来越长。
注意,由于时间限制,我从必须首先处理的最重要的片段开始。因此,其余部分将是文件上的更多随机切片。因此,解决方案应适用于随机切片(如果有的话)(我希望)。
我没有脚本编写方面的经验,所以如果我问一个愚蠢的问题,请原谅我,但我确实找不到任何答案。

最佳答案

我想到了几件事。

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

另外,我听到了关于dask的很棒的事情。它是通过并行,多核,多机器处理实现的可扩展平台,几乎与使用pandas和numpy一样简单,而所需资源却很少。

关于python - 如何有效打开30gb文件并对其进行处理而又不减慢速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55802587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com