使用多处理在python中读取多个大型csv文件的最佳策略?

使用多处理在python中读取多个大型csv文件的最佳策略?,python,pandas,multiprocessing,Python,Pandas,Multiprocessing,我正在编写一些代码,并希望通过多处理来改进它 最初,我有以下代码: 将Pool()作为p: lst=p.map(自路径到方向,路径) ... df=pd.concat(lst,忽略索引=True) 其中self.\u path\u to_df()基本上只调用pandas.read\u csv(…)并返回pandas数据帧 这将导致以下错误: . . . File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.fr

我正在编写一些代码,并希望通过多处理来改进它

最初,我有以下代码:

将Pool()作为p:
lst=p.map(自路径到方向,路径)
...
df=pd.concat(lst,忽略索引=True)
其中
self.\u path\u to_df()
基本上只调用
pandas.read\u csv(…)
并返回pandas数据帧

这将导致以下错误:

.
.
.
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 268, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 657, in get
    raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[                    ts                  id.orig  ...  successful history_category
0         1.331901e+09               ...        True            other
1         1.331901e+09               ...        True                ^
2         1.331901e+09               ...        True               Sh
3         1.331901e+09               ...        True               Sh
4         1.331901e+09               ...        True               Sh
...                ...               ...         ...              ...
23192090  1.332018e+09               ...       False            other
23192091  1.332017e+09               ...        True            other
23192092  1.332018e+09               ...        True            other
23192093  1.332018e+09               ...        True            other
23192094  1.332018e+09               ...        True            other

[23192095 rows x 24 columns]]'. Reason: 'error("'i' format requires -2147483648 <= number <= 2147483647")'
。
.
.
文件“/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/Python3.7/multiprocessing/pool.py”,第268行,在地图中
返回self.\u map\u async(func、iterable、mapstar、chunksize).get()
get中的文件“/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/Python3.7/multiprocessing/pool.py”,第657行
提升自我价值
multiprocessing.pool.MaybeEncodingError:发送结果时出错:'[ts id.orig…成功的历史记录\u类别
0 1.331901e+09…真实其他
1 1.331901e+09…正确^
2 1.331901e+09…真实Sh
3 1.331901e+09…真Sh
4 1.331901e+09…真Sh
...                ...               ...         ...              ...
23192090 1.332018e+09…假其他
23192091 1.332017e+09…真实其他
23192092 1.332018e+09…真实其他
23192093 1.332018e+09…真实其他
23192094 1.332018e+09…真实其他

[23192095行x 24列]]'。原因:“错误(“'i'格式需要-2147483648如果最终结果太大,无法放入内存,请尝试dask

import dask.dataframe as dd
df = dd.read_csv('*.csv')

然后,一旦它被读取,您就可以进行聚合等操作,并最终计算出您想要的答案。

如果最终结果太大,无法放入内存,请尝试dask

import dask.dataframe as dd
df = dd.read_csv('*.csv')

然后,一旦读取数据帧,您就可以进行聚合等操作,并最终进行计算以获得所需的答案。

您确实不希望将数据帧从子流程返回到主流程,因为这将导致数据帧被pickle,这将非常慢。如果读取CSV真的那么慢,您可以在子流程中分块读取它并且仍在子流程中,以快速格式写入磁盘(feather可能是一个不错的格式),然后读取主进程中的多个feather文件。multiprocessing.dummy.Pool是否会出现此问题?这将有助于了解问题是否与数据帧的序列化有关。总体而言,我认为Dask比Pool()更适合您的需要。它或多或少是为这个问题而设计的。@fizzybear回溯的截断部分只排除我自己的文件,因此multiprocessing.pool.py我认为您确实不想将数据帧从子进程返回到主进程,因为这将导致数据帧被pickle,这将非常慢。如果读取CSV真的那么慢,您可以在子进程中分块读取它,并且在子进程中以快速格式写入磁盘(feather可能是个不错的选择),然后读取主进程中的多个feather文件。multiprocessing.dummy.Pool是否会出现此问题?这将有助于了解问题是否与数据帧的序列化有关。总体而言,我认为Dask比Pool()更适合您的需要。它或多或少是为这个问题设计的。@fizzybear回溯的截断部分只排除了我自己的文件,所以我认为multiprocessing.pool.py