我编写了一个多线程网页抓取工具,可以收集最终写入非常大的csv文件的数据。唯一的问题是,程序目前正在使用大量内存(如果它的内存为15gb,我的所有计算机的物理内存都在使用中)。我不确定python是如何在后台管理内存的,但程序似乎仍然有用,但我确实经常得到这些停顿,我认为这与python或系统做了一些"记忆魔法"在后台。唯一可能的是CPU使用率。
无论如何,我认为逐步将数据写入硬盘会有所帮助,以减少内存使用量。我没有对数据进行任何额外的操作,所以我真的不需要它在内存中。
我以为我可以这样做:
# out_queue is queue.Queue() object containing data to be written
def csv_writer(out_queue):
with open(file, 'w+') as csvfile:
writer = csv.writer(csvfile,delimiter=',')
while True:
task = out_queue.get()
writer.writerow(task)
task.task_done()
但是我不确定open
函数是如何工作的,阅读它说文件对象被返回的文档,但我不确定这是什么意思。所以我想这里的主要问题是:
如果我使用with open
语句,打开的文件是否保存在内存中?阅读文档并没有特别帮助我。
我还阅读了一些关于使用缓冲打开文件的内容,在这种情况下会有用吗?
如果您有任何其他提示,对于那些处理过这类问题的人,是否有更好的解决方法?或者我应该把它留给python处理,无论如何?
答案 0 :(得分:4)
不,使用文件对象作为上下文管理器(通过with
语句)不会导致它将所有数据保存在内存中。它所做的就是确保在退出上下文时关闭文件对象。文件对象已经缓冲写入,但缓冲区最多只保存几千字节。 csv.writer()
对象立即将数据写入基础文件对象,不保留任何数据。
您的问题出在其他地方,您在此处显示的代码将不保留到千兆字节的内存。使用内存分析器(例如HeapPy或memory_profiler
)来确定导致进程使用如此多内存的原因。