如何将python并行计算(ipython并行或多处理)的结果输出到数据帧?
简单问题:我读过的所有教程都向您展示了如何使用ipython.parallel或multiprocessing将并行计算的结果输出到一个列表(或者最多是一个字典) 你能给我举一个简单的例子,用其中一个库将计算结果输出到共享数据帧吗 -本教程将向您展示如何读取输入数据帧(下面的代码),但我将如何将4次并行计算的结果输出到一个数据帧如何将python并行计算(ipython并行或多处理)的结果输出到数据帧?,python,pandas,parallel-processing,multiprocessing,ipython-parallel,Python,Pandas,Parallel Processing,Multiprocessing,Ipython Parallel,简单问题:我读过的所有教程都向您展示了如何使用ipython.parallel或multiprocessing将并行计算的结果输出到一个列表(或者最多是一个字典) 你能给我举一个简单的例子,用其中一个库将计算结果输出到共享数据帧吗 -本教程将向您展示如何读取输入数据帧(下面的代码),但我将如何将4次并行计算的结果输出到一个数据帧 import pandas as pd import multiprocessing as mp LARGE_FILE = "D:\\my_large_file.tx
import pandas as pd
import multiprocessing as mp
LARGE_FILE = "D:\\my_large_file.txt"
CHUNKSIZE = 100000 # processing 100,000 rows at a time
def process_frame(df):
# process data frame
return len(df)
if __name__ == '__main__':
reader = pd.read_table(LARGE_FILE, chunksize=CHUNKSIZE)
pool = mp.Pool(4) # use 4 processes
funclist = []
for df in reader:
# process each data frame
f = pool.apply_async(process_frame,[df])
funclist.append(f)
result = 0
for f in funclist:
result += f.get(timeout=10) # timeout in 10 seconds
print "There are %d rows of data"%(result)
您要求
多处理
(或其他python并行模块)输出到一个它们不直接输出到的数据结构。如果您使用的是池
,那么从任何并行包中都可以得到一个列表(使用map
)或迭代器(使用imap
)。如果使用多处理
中的共享内存,您可能能够将结果放入内存块中,该内存块可以通过ctypes
中的指针进行访问
所以问题是,你能从迭代器或共享内存块中提取结果到一个pandas.DataFrame
?我想答案是肯定的。是的,你可以。然而,我不认为我在教程中看到过这样做的简单例子……因为做起来并不是那么简单
迭代器路径似乎不太可能,因为您需要使用numpy
来消化迭代器,而不必首先将结果作为列表拉回到python中。我会选择共享内存路径。我认为这应该给您一个输出到数据帧中,然后您可以在多处理中使用它:
from multiprocessing import sharedctypes as sh
from numpy import ctypeslib as ct
import pandas as pd
ra = sh.RawArray('i', 4)
arr = ct.as_array(ra)
arr.shape = (2,2)
x = pd.DataFrame(arr)
然后,您所要做的就是将句柄传递给数组以进行多处理
import multiprocessing as mp
p1 = mp.Process(target=doit, args=(arr[:1, :], 1))
p2 = mp.Process(target=doit, args=(arr[1:, :], 2))
p1.start()
p2.start()
p1.join()
p2.join()
然后,使用一些指针魔法,结果应该填入您的DataFrame
我将让您编写doit
函数来处理数组
编辑:使用类似的方法,这看起来是个不错的答案…。同样,这似乎也起作用:。为什么不将输出放在一个列表中,并将其简化为一个数据帧,如reduce(lambda x,y:x.append(y),your_list)
?您需要向我们展示您正在尝试的操作,向我们展示您的单线程解决方案以及您打算如何对其进行多线程处理。非常感谢您的回答!