【问题标题】:Why memory error for line-by-line reading of large file?为什么逐行读取大文件时出现内存错误?
【发布时间】:2021-10-29 14:51:45
【问题描述】:

我很小心,不会一次将大文件加载到内存中。我宁愿逐行阅读。但是,我无法弄清楚为什么在读取某些行(索引:32671363)后出现内存错误?

最小的例子如下。我之前尝试过包含更大文件的代码,但从未收到此错误。在索引 32671363 之后文件可能已损坏。但是我怎样才能找出坏行/字符或导致它的任何原因(我不能只打开文本文件并查看它,因为它是 14 GB!) ?我尝试在控制台上打印每一行,但输出没有告诉我任何信息(见下文)。关于如何深入挖掘的任何建议?

我尝试了 pandas(以块/数据帧的形式读取数据),在这个索引处给了我类似的内存错误。

with open('filename.txt', 'r') as f0:
    for i, line in enumerate(f0):
        if i > 32671360:
            print(i, repr(line))
        else:
            pass

样本输出

32671361 '239,7449657815100,6998.258682,7449.502713\n'
32671362 '263,7449658092300,6998.258682,7449.502713\n'
32671363 '423,7449658212000,6998.258682,7449.502713\n'
Traceback (most recent call last):
  File "read_lst_line.py", line 48, in <module>
    for i, line in enumerate(f0):
MemoryError

【问题讨论】:

  • sys.stdout 重定向了吗?
  • 实际上 - 之后文件中是否可能不再有换行符?如果单行占用的内存超过(您的 RAM)字节,您可能会耗尽内存。
  • 标准 Unix 工具 wc 可能会提供信息。
  • 代替print(i, repr(line)),也许试试print(f0.read(1000)); break
  • @don'ttalkjustcode:谢谢。我试过看看:b'263,7449658092300,6998.258682,7449.502713\r\n423,7449658212000,6998.258682,7449.502713\r\n1786,7449658285900,699\x00\x00\x00\x00\x00` and then a Memory Error. The \x00` 字符还在继续,不知道那是什么?有没有办法确定在几个尾随\x00之后是否有一些有用的数据?

标签: python pandas memory large-data large-files


【解决方案1】:

您可以使用以下命令检查某些行发生了什么:

head -n 32671364 | tail -n 1

或使用this post 中指示的 sed。

该行可能有一些可疑的东西会破坏 repr,从而导致内存错误。

【讨论】:

  • 感谢您的回复。你的答案有windows版本吗?你提到的那个在linux上工作?
猜你喜欢
  • 2018-10-13
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2017-10-03
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多