在 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 开发人员,您也可以提交错误报告。解释器永远不应该出现段错误。