gpt4 book ai didi

python - 读取大文件时跳过一长行以避免 MemoryError?

转载 作者:行者123 更新时间:2023-11-28 18:17:55 25 4
gpt4 key购买 nike

我需要扫描两个大的 txt 文件(都是大约 100GB,10 亿行,几列)并取出某一列(写入新文件)。文件看起来像这样

ID*DATE*provider
1111*201101*1234
1234*201402*5678
3214*201003*9012
...

我的 Python 脚本是

N100 = 10000000   ## 1% of 1 billion rows
with open("myFile.txt") as f:
with open("myFile_c2.txt", "a") as f2:
perc = 0
for ind, line in enumerate(f): ## <== MemoryError
c0, c1, c2 = line.split("*")
f2.write(c2+"\n")
if ind%N100 == 0:
print(perc, "%")
perc+=1

现在上面的脚本对一个文件运行良好,但对另一个文件却卡在了 62%。错误消息显示 MemoryError for for ind, line in enumerate(f):。我在不同内存的不同服务器上试了几次,错误都是一样的,都是62%。我等了几个小时来监控 RAM,它在 62% 时爆炸到 28GB(总计=32GB)。所以我猜在那个文件中有一行太长了(可能没有以 \n 结束?)因此 Python 在尝试将它读取到 RAM 时卡住了。

所以我的问题是,在我去我的数据提供者之前,我可以做些什么来检测错误行并以某种方式绕过/跳过将其作为一大行读取?感谢任何建议!

编辑:

从“错误行”开始的文件可能全部被另一个行分隔符而不是 \n 搞乱了。如果是这样,我可以检测到 sep 行并继续提取我想要的列,而不是丢弃它们吗?谢谢!

最佳答案

此(未经测试的)代码可能会解决您的问题。它将每次读取的输入限制为 1,000,000 字节,以减少其最大内存消耗。

请注意,此代码返回每行的 百万个字符。如何处理长线还有其他可能性:

  • 返回前一百万个字符
  • 返回最后一百万个字符
  • 完全跳过该行,可选择记录该行,或者
  • 提出异常。

#UNTESTED
def read_start_of_line(fp):
n = int(1e6)
tmp = result = fp.readline(n)
while tmp and tmp[-1] != '\n':
tmp = fp.readline(n)
return result

N100 = 10000000 ## 1% of 1 billion rows
with open("myFile.txt") as f:
with open("myFile_c2.txt", "a") as f2:
perc = 0
for ind, line in enumerate(iter(lambda: read_start_of_line(f), '')):
c0, c1, c2 = line.split("*")
f2.write(c2+"\n")
if ind%N100 == 0:
print(perc, "%")
perc+=1

关于python - 读取大文件时跳过一长行以避免 MemoryError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47188292/

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