python非阻塞写csv文件

时间:2018-04-27 16:23:25

标签: python python-multithreading python-asyncio

我正在编写一些python代码来进行一些计算并将结果写入文件。这是我目前的代码:

for name, group in data.groupby('Date'):
    df = lot_of_numpy_calculations(group)

    with open('result.csv', 'a') as f:
        df.to_csv(f, header=False, index=False)

有时计算和写入都需要。我在python中阅读了一篇关于async的文章,但我不知道如何实现它。有没有一种简单的方法来优化这个循环,以便它不会等到写完成并开始下一次迭代?

2 个答案:

答案 0 :(得分:4)

由于numpy和pandas都不是asyncio,这对于线程来说可能是比asyncio更好的用例。 (另外,基于asyncio的解决方案无论如何都将使用幕后的线程。)

例如,此代码生成一个使用队列提交工作的编写器线程:

import threading, queue

to_write = queue.Queue()

def writer():
    # Call to_write.get() until it returns None
    for df in iter(to_write.get, None):
        with open('result.csv', 'a') as f:
            df.to_csv(f, header=False, index=False)
threading.Thread(target=writer).start()

for name, group in data.groupby('Date'):
    df = lot_of_numpy_calculations(group)
    to_write.put(df)
# enqueue None to instruct the writer thread to exit
to_write.put(None)

请注意,如果写入始终比计算慢,则队列将继续累积数据帧,这可能最终消耗大量内存。在这种情况下,请确保通过将maxsize参数传递给constructor来为队列提供最大大小。

另外,考虑为每次写入重新打开文件会减慢写入速度。如果写入的数据量很小,也许您可​​以通过事先打开文件来获得更好的性能。

答案 1 :(得分:1)

由于大多数操作系统don't support异步文件I / O,现在常见的跨平台方法是使用线程。

例如,aiofiles模块包装线程池以为asyncio提供文件I / O API。