在Windows机器上使用Python 2.7,我在SQL查询中有一个大的pandas
DataFrame(大约700万行和20多列),我希望通过循环ID过滤然后运行计算得到的过滤数据。我也想同时这样做。
我知道如果我尝试使用Windows中multiprocessing
包中的标准方法执行此操作,每个进程都会生成一个大型DataFrame的新实例供自己使用,我的内存将被耗尽。因此,我尝试使用我在remote managers上阅读的信息,使我的DataFrame成为代理对象并在每个流程中分享,但我努力使其发挥作用。
我的代码在下面,我可以让它在单个for循环上工作没问题,但如果我将它作为一个并行进程,内存会被吃掉:
import multiprocessing
import pandas
import pyodbc
def download(args):
"""pydobc code to download data from sql database"""
def calc(dataset, index):
filter_data = dataset[dataset['ID'] == index]
"""run calculations on filtered DataFrame"""
"""append results to local csv"""
if __name__ == '__main__':
data_1 = download(args_1)
data_2 = download(args_2)
all_data = data_1.append(data_2) #Append downloaded DataFrames into one
unique_id = pandas.unique(all_data['ID'])
pool = multiprocessing.Pool()
[pool.apply_async(calc, args=(all_data, x) ) for x in unique_id ]
答案 0 :(得分:0)
Q :“ 共享 大熊猫DataFrame 具有多处理功能,用于在Python中循环吗?“
虽然在 multiprocessing
模块中有一些工具可以共享一些数据,但实际使用这里实际上表示了 反模式 出于性能原因,对于呈现的人,在Pool
实例中,以“正义” - [CONCURRENT]
-时尚。
您花了巨大的成本将筛选工作转移到Pool
个独立(“公正” - [CONCURRENT]
)工作人员他们每个人都在等待中央GIL锁的服务,这将Manager
的工作再次变成纯粹的 [SERIAL]
,更糟糕的是, RAM I / O限制(由于无法自由访问RAM而导致的性能窒息)主要是在错误的方向上进行的。
一些SLOC中看不到的烧钱速度(附加成本)可能更高(而且通常 ),比在“ just” - [CONCURRENT]
中运行多行代码执行(任何潜在的(直到经过精心设计,调整和验证)潜在的)体内性能优势/ strong>(对于True- [PARALLEL]
来说更难))。