我有一个大文件,直接读取到内存会引发MemoryError
。我通过将其读取到生成器来克服了这一点
def rea():
with open('D:\\random.forge', 'rb') as f:
yield f.read()
当我想使用rea()
从for loop
遍历创建的生成器时,我总是有MemoryError
。我想使用del
关键字删除迭代值,但是似乎当您使用for loop
对生成器进行迭代时,它将整个生成器保存到内存中。在这种特定情况下,我可以以某种方式迭代生成器吗?该文件的大小为几GB。
答案 0 :(得分:0)
在创建的生成器上进行第一次迭代时,调用f.read()
将整个文件加载到内存中。
尝试屈服行,而不是全部内容:
def rea():
with open('D:\\random.forge', 'rb') as f:
for line in f:
yield line
答案 1 :(得分:0)
方法 public E remove(int ind)
{
current = first.findNode(ind);
if (first == null) return current.element;
if (first == current)
{
first = current.next;
size--;
return current.element;
}
while (first.next != null)
{
if (first.next == current)
{
first.next = first.next.next;
return current.element;
}
first = first.next;
}
size--;
return current.element;
}
读取整个文件,以便将其加载到内存中。
您可以逐步阅读它。
对于文本文件,您可以按行读取:
.read()
对于二进制文件,可以按批读取:
def read():
with open('D:\\random.forge', 'r') as f:
return f
for line in read():
print(line)
答案 2 :(得分:-1)
f.read()
可以采用块大小的参数,这是您要在一次迭代中读取的文件的大小。例如,如果您想一次读取1 kb,则可以将块大小设置为1024。
def rea(chunk_size=1024):
with open('D:\\random.forge', 'rb') as f:
data = f.read(chunk_size)
yield data