在 Python 中读取一个巨大的文件:为什么我会遇到分段错误?
Reading a huge file in Python: Why am I getting a Segmentation Fault?
我知道我不应该一次将整个文件读入内存,但我没有那样做。
我想也许我在循环中做了一些内存很重的事情,然后摆脱了一切,直到我剩下这个:
with open("huge1.txt", "r") as f:
for line in f:
pass
它给了我一个分段错误。
如果我做对了一切,迭代这样的文件是惰性的,一次不应将多于一行加载到内存中。
我也尝试使用 islice
,但结果相同。
我的文件是基于行的,行都很短,文件大小约为 6 GB。
我错过了什么?
Try/except 会让您知道问题出在哪里
with open("huge1.txt", "r") as f:
ctr=0
previous=""
try:
for line in f:
ctr += 1
previous=line
except:
print(ctr, previous)
无论如何都不应发生分段错误,因为 python 解释器应该捕获错误并在语言中引发异常。所以你的 python 解释器肯定有错误。
现在,至于什么会触发这个错误。您逐行读取文件,一旦读取下一行就丢弃每一行(实际上一次保留 2 行,因为在下一行的分配完成之前不能丢弃上一行)。
因此,如果它 运行 内存不足(这可能是分段错误的原因,例如 malloc()
returning NULL
和调用者未能检查 return 值),这可能是因为某些行仍然太大。
如果你运行一个GNU/something系统,你可以运行wc -L huge1.txt
检查最长行的长度。
如果你确实有很长的一行,要么是文件有问题,你可以修复它,要么你需要逐块而不是逐行读取文件,使用 f.read(2**20)
如果您想帮助 python 开发人员,您也可以提交错误报告。解释器永远不应该出现段错误。
我知道我不应该一次将整个文件读入内存,但我没有那样做。
我想也许我在循环中做了一些内存很重的事情,然后摆脱了一切,直到我剩下这个:
with open("huge1.txt", "r") as f:
for line in f:
pass
它给了我一个分段错误。
如果我做对了一切,迭代这样的文件是惰性的,一次不应将多于一行加载到内存中。
我也尝试使用 islice
,但结果相同。
我的文件是基于行的,行都很短,文件大小约为 6 GB。
我错过了什么?
Try/except 会让您知道问题出在哪里
with open("huge1.txt", "r") as f:
ctr=0
previous=""
try:
for line in f:
ctr += 1
previous=line
except:
print(ctr, previous)
无论如何都不应发生分段错误,因为 python 解释器应该捕获错误并在语言中引发异常。所以你的 python 解释器肯定有错误。
现在,至于什么会触发这个错误。您逐行读取文件,一旦读取下一行就丢弃每一行(实际上一次保留 2 行,因为在下一行的分配完成之前不能丢弃上一行)。
因此,如果它 运行 内存不足(这可能是分段错误的原因,例如 malloc()
returning NULL
和调用者未能检查 return 值),这可能是因为某些行仍然太大。
如果你运行一个GNU/something系统,你可以运行wc -L huge1.txt
检查最长行的长度。
如果你确实有很长的一行,要么是文件有问题,你可以修复它,要么你需要逐块而不是逐行读取文件,使用 f.read(2**20)
如果您想帮助 python 开发人员,您也可以提交错误报告。解释器永远不应该出现段错误。