我正在尝试在我的python脚本中加载~2GB的文本文件(大约35K文件)。我在page.read()的三分之一处遇到内存错误。 I'
for f in files:
page = open(f)
pageContent = page.read().replace('\n', '')
page.close()
cFile_list.append(pageContent)
我从未在python中处理过这种大小的对象或进程。我检查了一些其他Python MemoryError相关的线程,但我无法得到任何东西来修复我的场景。希望有一些东西可以帮助我。
答案 0 :(得分:2)
您正试图一次性加载到内存中。这可能是因为进程大小限制(特别是在32位操作系统上),或者因为没有足够的RAM。
如果有足够的RAM,64位操作系统(和64位Python)可以做到这一点,但是你可以简单地改变你的程序工作方式,这样就不会每次都在RAM中。
cFile_list用于什么?你真的需要同时在内存中的所有页面吗?
答案 1 :(得分: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。
有关生成器的详细信息,请参阅http://www.python.org/dev/peps/pep-0289/。
答案 2 :(得分: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 - 您将获得目标行。 使用这种方法(直接处理文件的必要位置而不运行整个文件),您节省了大量时间并可以处理大量文件。