Python加载文本文件时内存错误
我正在尝试在我的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是用来干什么的?你真的需要同时把所有页面都放在内存里吗?