【问题标题】:Why getting Memory Error? Python为什么会出现内存错误? Python
【发布时间】:2016-10-17 21:55:15
【问题描述】:

我有一个 5gb 的文本文件,我正在尝试逐行读取它。 我的文件格式为:Revieweridpiddatetitlebody 这是我的代码

o = open('mproducts.txt','w')
with open('reviewsNew.txt','rb') as f1:
    for line in f1:
        line = line.strip()
        line2 = line.split('\t')
        o.write(str(line))
        o.write("\n")

但是当我尝试运行它时出现内存错误。我有 8gb 内存和 1Tb 空间,那为什么会出现这个错误?我试图分块阅读它,但我也得到了那个错误。

MemoryError 

【问题讨论】:

  • 该文件中最长的行有多长?
  • @FranciscoCouzo 我不知道。但是当我尝试在 EmEditor 中打开该文件时,会弹出一个窗口,提示“它包含一些非常大的行。你想以二进制格式打开它吗?”通过选择二进制选项,它可以正确显示文件。
  • o 中的o.write() 是什么?如果您将读取的所有内容都保存在内存中,那么您遇到内存错误我并不感到惊讶。
  • Mode 'rb' 以二进制模式打开文件。试试'r+'。见docs.python.org/2/tutorial/inputoutput.html
  • 使用for i, line in enumerate(f1): 并在每次迭代中打印i。您看到的最后一个打印应该是最后一行。

标签: python


【解决方案1】:

更新:

安装 64 位 Python 解决了这个问题。

OP 使用的是 32 位 Python,这就是内存限制的原因。


阅读整个 cmets 我认为这可以帮助你。

  • 由于要处理数据,因此无法读取块中的文件(如 1024)。
  • 改为以多行的形式读取文件,即一次 N 行。
  • 您可以在Python中使用yield关键字和itertools来实现上述功能。

总结:一次取N行,处理后再写。

示例代码:

from itertools import islice
#You can change num_of_lines
def get_lines(file_handle,num_of_lines = 10):
    while True:
        next_n_lines = list(islice(file_handle, num_of_lines))
        if not next_n_lines:
            break
        yield next_n_lines


o = open('mproducts.txt','w')

with open('reviewsNew.txt','r') as f1:
    for data_lines in get_lines(f1):
        for line in data_lines:
            line = line.strip()
            line2 = line.split('\t')
            o.write(str(line))
            o.write("\n")
o.close()

【讨论】:

  • 你说的太对了。我安装了 64 位,它工作。非常感谢;)
  • 我会赞成这个答案,但我不能这样做,因为我的分数低于 15 :P。但是非常感谢你:)
  • 没有问题。好处是它有效,并且您了解了 32 位应用程序的内存限制 :) :)
  • 是的,因为它是 32 位的,所以它只能使用 4GB。但是我的代码是逐行读取的,所以它不需要那么多内存。那么为什么我会收到这个错误呢?
  • 原因是for ... in somefile:将所有文件内容复制到内存中
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2015-12-07
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多