【问题标题】:Write CSV Data to hard disk progressively to reduce memory usage逐步将 CSV 数据写入硬盘以减少内存使用
【发布时间】:2014-08-03 22:25:16
【问题描述】:

我编写了一个多线程网络爬虫,它收集数据并最终写入一个非常大的 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来处理?

【问题讨论】:

  • 对不起,可能没有解释清楚,我的内存问题是因为我将从网络上抓取的所有数据保存在内存中。目前,该程序的结构是在我的所有爬虫线程退出后将所有数据写入文件。

标签: python csv memory memory-management


【解决方案1】:

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

您的问题出在其他地方,您在此处显示的代码不会占用千兆字节的内存。使用内存分析器(例如 HeapPymemory_profiler)找出导致您的进程使用如此多内存的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2014-12-21
    • 2012-11-28
    • 2019-12-13
    相关资源
    最近更新 更多