逐步将CSV数据写入硬盘以减少内存使用量

时间:2014-06-13 11:12:50

标签: python csv memory memory-management

我编写了一个多线程网页抓取工具,可以收集最终写入非常大的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处理,无论如何?

1 个答案:

答案 0 :(得分:4)

不,使用文件对象作为上下文管理器(通过with语句)不会导致它将所有数据保存在内存中。它所做的就是确保在退出上下文时关闭文件对象。文件对象已经缓冲写入,但缓冲区最多只保存几千字节。 csv.writer()对象立即将数据写入基础文件对象,不保留任何数据。

您的问题出在其他地方,您在此处显示的代码将保留到千兆字节的内存。使用内存分析器(例如HeapPymemory_profiler)来确定导致进程使用如此多内存的原因。