我正在读取块中的csv并将块传递给4个进程池。
pool = Pool(processes=4)
chunk_index = 1
for df in pd.read_csv(downloaded_file, chunksize=chunksize, compression='gzip', skipinitialspace=True, encoding='utf-8'):
output_file_name = output_path + merchant['output_file_format'].format(
file_index, chunk_index)
pool.map(wrapper_process, [
(df, transformer, output_file_name)])
chunk_index += 1
使用这段代码,我的理解是它应该向我展示4个连续运行的过程。但是在下面的htop截图中,它始终是2运行。一个是htop命令它自己。这意味着当时只有1个python进程在运行。
从内存使用情况来看,它是12 gb,我认为只有当4个块加载到内存中时才有可能提供1个块几乎是2gb
我如何一次性使用处理器。
答案 0 :(得分:0)
问题在于你误解了地图是如何运作的。 来自the doc:
map(func, iterable[, chunksize])
此方法将迭代器切割为它提交的多个块 将进程池作为单独的任务。这些(近似)的大小 可以通过将chunksize设置为正整数来指定块。
作为iterable,您提供的列表只包含一个元素:元组(df, ...)
。
但是你需要提供一个包含许多元素的iterable。要做到这一点,你需要
首先准备列表,然后将其发送到进程(提示:
你可以写Pool()
并让python找出核心数
本身)
pool = Pool()
chunk_index = 1
list = []
for df in pd.read_csv(downloaded_file,
chunksize=chunksize,
compression='gzip',
skipinitialspace=True,
encoding='utf-8'):
output_file_name = output_path +
merchant['output_file_format'].format(file_index, chunk_index)
list.append((df, transformer, output_file_name)])
chunk_index += 1
pool.map(wrapper_process, list)
但现在您遇到了需要保存完整csv数据的问题 内存可能可以,但通常不是。解决这个问题 你可以切换到使用队列:你会
STOP
元素放入队列,以便进程自行退出the official doc (look at the last example on the page)中有一个很好的例子,它解释了你会接近它。
最后一句话:您确定您的操作受CPU限制吗?你做了很多
处理wrapper_process
(可能还有transformer
)?因为如果您只是单独拆分CSV
没有太多处理程序的文件是IO绑定而不是CPU绑定
然后多处理没有任何意义。