Python加载文本文件时内存错误

0 投票
3 回答
2548 浏览
提问于 2025-04-16 20:09

我正在尝试在我的Python脚本中加载大约2GB的文本文件(大约35,000个文件)。在执行page.read()时,大约加载到三分之一的地方就出现了内存错误。

for f in files:
    page = open(f)
    pageContent = page.read().replace('\n', '')
    page.close()

    cFile_list.append(pageContent)

我从来没有在Python中处理过这么大的对象或进程。我查看了一些与Python内存错误相关的讨论,但没有找到能解决我这个情况的方法。希望能找到一些能帮我解决问题的建议。

3 个回答

0

这样读取整个文件到内存中并不是个好办法。

正确的方法是:习惯使用索引。

首先,你需要创建一个字典,记录每一行的起始位置(字典的键是行号,值是前面所有行的总长度)。

t = open(file,’r’)
dict_pos = {}

kolvo = 0
length = 0
for each in t:
    dict_pos[kolvo] = length
    length = length+len(each)
    kolvo = kolvo+1

最后,目标函数:

def give_line(line_number):
    t.seek(dict_pos.get(line_number))
    line = t.readline()
    return line

t.seek(line_number) – 这个命令可以让你直接跳到文件中某一行的开头。所以,如果你接下来用readline命令,就能得到你想要的那一行。

使用这种方法(直接跳到文件中需要的位置,而不是从头到尾读取整个文件),你可以节省大量时间,并且能够处理非常大的文件。

1

如果可以的话,考虑使用生成器:

file_list = []
for file_ in files:
    file_list.append(line.replace('\n', '') for line in open(file_))

现在,file_list 是一个迭代器的列表,这比把每个文件的全部内容都读到一个字符串中要节省内存。当你需要某个特定文件的完整字符串时,可以这样做:

string_ = ''.join(file_list[i])

不过要注意,由于 Python 中迭代器的特性,file_list 只能遍历一次。

想了解更多关于生成器的内容,可以查看 这个链接

2

你试图一次性加载太多数据到内存中。这可能是因为进程大小的限制(特别是在32位操作系统上),或者是因为你的内存(RAM)不够用。

如果使用64位操作系统(和64位的Python),在有足够内存的情况下是可以做到的。不过,也许你可以考虑改变一下程序的工作方式,不让每一页都同时在内存中。

cFile_list是用来干什么的?你真的需要同时把所有页面都放在内存里吗?

撰写回答