Python OSError:从大文件读取时地址错误

Python OSError: Bad address when reading from large file

提问人:Suriname0 提问时间:6/1/2018 更新时间:6/1/2018 访问量:5721

问:

我从使用 Python 3 中的语法创建的文件句柄读取时观察到“错误地址”。OSErrorwith

有问题的文件是 39G,但我应该有足够的 RAM 来读取整个文件。错误消息使我相信我遇到了某种操作系统限制;我运行的是 CentOS 6.9。谁能帮我了解可能导致这种行为的原因?

该文件在 python 之外是完全可读的,例如在 bash 中使用 or 。headvim

产生错误的简化代码示例如下所示:

In [2]: with open(filename, 'r', encoding="utf8") as infile:
   ...:     infile.read()
   ...:     
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-2-3f216811bec7> in <module>()
  1 with open(filename, 'r', encoding="utf8") as infile:
----> 2     infile.read()
  3 

OSError: [Errno 14] Bad address
Python IO CentOS

评论

0赞 zvone 6/1/2018
您是在 iPython 中执行此操作的,因此它不仅会尝试读取 39GB,还会尝试打印它们。这可能与问题有关,实际上可能需要在所需内存上花费大量开销。无论如何,即使您有足够的 RAM,您也不应该一次将这种大小的整个文件读入内存......
0赞 abarnert 6/1/2018
这里要做的显而易见的事情是文件而不是它(尽管这意味着您拥有而不是),这是工具所做的,或者迭代地处理它而不是一次处理它,这就是工具所做的。mmapreadbytesstrgrephead
1赞 abarnert 6/1/2018
另外,你有多少内存?要读取一个 39GB 的 UTF-8 文本文件,其中大部分是 ASCII,但其中包含一些星体字符,最终字符串大约需要 156GB。
0赞 abarnert 6/1/2018
无论如何,您可以将整个文件读入内存,但您不能一口气完成所有工作。特别是如果您使用的是 Python 2.x,但甚至可能使用 3.x。例如,您的 Python 最终可能使用使用 32 位大小的旧调用,如果它超过 .read()read1<<31
0赞 Suriname0 6/1/2018
@zvone,问题是我正在使用另一个 IO 库,该库最终会调用文件句柄,因此,虽然我很想一次读取块,但这会使 IO 问题大大复杂化。read()

答: 暂无答案