python代码执行数据提取和预处理(将数据转换为可迭代以使Pool Map运行),然后调用Pool Map自动对数据进行子集化并并行运行。但是,我发现除了应该在每个进程中运行的功能之外,数据提取和预处理也在每个进程中再次运行。
代码如下:
#Data Pull
orig_data= pd.read_csv(<fileath>)
#Data Preprocessing
start=time.time()
transformed_input=list() # transformed_input is populated with data from orig_data dataframe as required
end=time.time()
print("Preprocessing Time")
print(end-start)
def examplefunction(transformed_input_sub):
# Required Function
return output
if __name__ == '__main__':
from multiprocessing import Pool
p=Pool()
s=time.time()
output=p.map(examplefunction,transformed_input)
p.close()
p.join()
e=time.time()
print("Time Taken")
print(e-s)
预期输出:
预处理时间
5.01
花费的时间
10在4个进程上运行时的实际输出:
预处理时间
5.01
预处理时间
5.12
预处理时间
5.35
预处理时间
5.41
花费的时间
10
但是,尽管对每个进程都运行了预处理,但此代码的输出正确(并已验证),据我所知,这并不是应该做的事情。然后,当我使用Teradata Pull处理近5000万条记录而不是从仅包含一小部分数据的csv中提取数据时,就会出现问题。没有多处理功能的TD拉动效果很好,但是有多处理功能时会引发以下错误:
数据库名称
中没有更多的后台打印空间
这可能是每个进程都在运行TD Pull。
如何确保Pool仅并行运行传递给它的函数,而不从头开始运行完整的代码?
我尝试更改代码块的顺序,在name =='main'块之外调用import语句,还将数据提取和预处理代码放在单独的python代码中,并在main中使用exec()进行调用程序。