首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中将数据作为后台进程写入磁盘

在Python中将数据作为后台进程写入磁盘
EN

Stack Overflow用户
提问于 2013-04-25 20:25:34
回答 3查看 3.1K关注 0票数 7

我有一个用Python编写的程序,它基本上执行以下操作:

代码语言:javascript
运行
复制
for j in xrange(200):
    # 1) Compute a bunch of data
    # 2) Write data to disk

1)大约需要2-5分钟

2)大约需要1分钟

注意,有太多的数据需要保存在内存中。

理想情况下,我想要做的是以一种避免CPU空闲的方式将数据写入磁盘。这在Python中是可能的吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-25 20:33:06

您可以像这样尝试using multiple processes

代码语言:javascript
运行
复制
import multiprocessing as mp

def compute(j):
    # compute a bunch of data
    return data

def write(data):
    # write data to disk

if __name__ == '__main__':
    pool = mp.Pool()
    for j in xrange(200):
        pool.apply_async(compute, args=(j, ), callback=write)
    pool.close()
    pool.join()

pool = mp.Pool()将创建一个工作进程池。默认情况下,工作进程的数量等于计算机拥有的CPU核心数量。

每个pool.apply_async调用都会对一个任务进行排队,以便由工作进程池中的一个工作进程运行。当worker可用时,它会运行compute(j)。当worker返回值data时,主进程中的一个线程运行回调函数write(data),其中data是worker返回的数据。

一些注意事项:

  • 数据必须是可拾取的,因为它是通过Queue.
  • There从工作进程传回主进程的,因此不能保证工作进程完成任务的顺序与任务被发送到池的顺序相同。因此,数据写入磁盘的顺序可能不对应于从0到199的j。解决此问题的一种方法是将数据写入sqlite (或其他类型的)数据库,并将j作为数据字段之一。然后,当您希望按顺序读取数据时,您可以SELECT * FROM table ORDER BY j.
  • Using多个进程将增加所需的内存量,因为数据是由工作进程生成的,并且等待写入磁盘的数据在队列中累积。您也许能够通过使用NumPy阵列来减少所需的内存量。如果这是不可能的,那么您可能需要减少进程的数量:

池= mp.Pool(processes=1)

这将创建一个工作进程(运行compute),让主进程运行write。由于computewrite耗时更长,因此队列不会备份超过一个要写入磁盘的数据块。但是,您仍然需要足够的内存来计算一个数据块,同时将不同的数据块写入磁盘。

如果你没有足够的内存来同时做这两件事,那么你别无选择--你的原始代码,顺序地运行computewrite,是唯一的方法。

票数 11
EN

Stack Overflow用户

发布于 2013-04-25 20:29:15

你可以使用Queue.Queue (模块在这里:Queue)和threading.Thread (或者threading.start_new_thread,如果你只是想要一个函数),模块在这里:threading -因为文件写入不是CPU密集型的,并且使用更多的IO。( GIL不会影响它)。

票数 3
EN

Stack Overflow用户

发布于 2013-04-25 20:40:28

简单的方法是只使用线程和队列。另一方面,如果计算部分不依赖于全局状态,并且您的计算机具有多个CPU核心,则更有效的方法是使用process pool

代码语言:javascript
运行
复制
from multiprocessing import Pool

def compute_data(x):
    return some_calculation_with(x)

if __name__ == '__main__':
    pool = Pool(processes=4) # let's say you have quad-core, so start 4 workers

    with open("output_file","w") as outfile:
        for calculation_result in pool.imap(compute_data, range(200)):
        # pool.imap returns results as they come from process pool    
            outfile.write(calculation_result)  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16214736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档