我正在努力解决问题。我很感激您对此的宝贵意见。
问题陈述: 我试图在同一个基本目录中读取大量文件(大约10 ** 6)。每个文件都具有与模式匹配的名称(YYYY-mm-dd-hh),文件内容如下
mm1, vv1
mm2, vv2
mm3, vv3
.
.
.
其中mm
是一天中的分钟,而vv
“是相对于该分钟的某个数值。我需要找到一个开始时间(例如2010-09-22-00)和结束时间(例如2017-09-21-23),所有vv
的平均值。
因此,基本上用户会向我提供start_date
和end_date
,并且我必须获得给定日期范围之间所有文件的平均值。所以我的功能是这样的:
get_average(start_time, end_time, file_root_directory):
现在,我想要了解的是如何使用多处理来平均较小的块,然后构建它以获得最终值。
注意:我不是在寻找线性解决方案。请告诉我如何在较小的块中解决问题,然后总结以找到平均值。
我尝试通过创建一个包含4个进程的池来在python中使用multiprocessing
模块,但是我无法弄清楚如何在内存中保留这些值并将结果一起添加到所有块中。
答案 0 :(得分:0)
您的进程将受I / O限制。 多处理可能不是非常有用,如果不是适得其反。
此外,基于大量小文件的存储系统并不是最好的。您应该查看一个时间系列数据库,例如Influxdb。
答案 1 :(得分:0)
鉴于实际处理是微不足道的 - 每个文件的总和和计数 - 使用多个进程或线程不会获得太多收益。这是因为90%以上的努力是打开每个文件并将内容传输到内存中。
但是,最明显的分区将基于一些每数据文件方案。因此,如果搜索范围是(您的示例)2010-09-22-00
到2017-09-21-23
,那么每小时有七年(可能是?)一个文件,总计61,368个文件(包括两个闰日)。< / p>
至少到目前为止,61,000个进程在一个系统上运行效率不高。 (从现在起几年后它可能是一个合理的功能。)但是对于一个真正的(非超级计算)系统,将问题划分为几个部分,可能是执行工作的CPU数量的两倍或三倍。这台台式计算机有四个核心,所以我首先尝试12个进程,每个进程独立计算1/12文件的总和和计数(存在的样本数,如果可变)。
使用线程可以消除进程间通信。或者,对于面向过程的方法,为每个过程设置管道以接收结果是一件简单的事情。