Python 多处理 : Errors from different codes

标签 python multiprocessing

我有一个包含 1000 万行的数据框。每行的迭代和计算需要花费太多时间。我想在更短的时间内得到结果。我尝试了不同的多处理代码,但每次都遇到不同的错误。有人可以帮我解决这个问题吗?谢谢您提前。

d3 是超过 1000 万行和 29 列的数据帧。最后一列的名称是“计算”,该列中的所有值均为零。通过使用其他列的值,我计算了新值,并将新值设置到“计算”列的每行。

第一个代码

def fun():
   for i in d3.index:
        if (d3.iloc[i, 3:4])[0] == (d3.iloc[i + 1, 3:4])[0]:
            d3.loc[d3.index[i], 'Calculation']==(d3.iloc[i, 22:23] - d3.iloc[i + 1, 22:23])
        else:
            d3.loc[d3.index[i],'Calculation']=d3.iloc[i, 13:14][0]

if __name__=="__main__":
    p1 = mp.Process(target=fun, args=())
    p2 = mp.Process(target=fun, args=())
    p3 = mp.Process(target=fun, args=())
    p4 = mp.Process(target=fun, args=())
    p1.start()
    p2.start()
    p3.start()
    p4.start()

第二个代码

def fun(i):
    if (d3.iloc[i, 3:4])[0] == (d3.iloc[i + 1, 3:4])[0]:
       d3.set_value(i, "Calculation", (d3.iloc[i, 22:23] - d3.iloc[i + 1, 22:23]))
    else:
       d3.set_value(i, "Calculation", d3.iloc[i, 13:14])

if __name__=="__main__":
    p1 = mp.Process(target=fun, args=(d3.index, ))
    p2 = mp.Process(target=fun, args=(d3.index, ))
    p3 = mp.Process(target=fun, args=(d3.index, ))
    p4 = mp.Process(target=fun, args=(d3.index, ))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p1.join()
    p2.join()
    p3.join()
    p4.join()

第三个代码

def fun(q):

    for i in d3.index:
        if (d3.iloc[i, 3:4])[0] == (d3.iloc[i + 1, 3:4])[0]:
           d3.loc[d3.index[i], 'Calculation']==(d3.iloc[i, 22:23] - d3.iloc[i + 1, 22:23])
        else:
            d3.loc[d3.index[i], 'Calculation']==(d3.iloc[i, 22:23] - d3.iloc[i + 1, 22:23])
    q.put(d3)``

if __name__ == "__main__":
    q = mp.Queue()
    processes = [mp.Process(target=fun, args=(q,)) for x in range(4)]
    for p in processes:
       p.start()
    for p in processes:
       p.join()
    results = [q.get() for p in processes]

错误1:

File "pandas\_libs\ops.pyx", line 103, in pandas._libs.ops.vec_compare
ValueError: Buffer has wrong number of dimensions (expected 1, got 0)

错误2:

File "pandas\_libs\hashtable_class_helper.pxi", line 1614, in     pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0

错误3:

File "pandas\_libs\ops.pyx", line 103, in pandas._libs.ops.vec_compare
ValueError: Buffer has wrong number of dimensions (expected 1, got 0)

最佳答案

在第三个示例中,您需要将 q 和 d3 传递给子流程。场景中发生的情况是,如果 fun(q, d3) 修改 d3,则 d3 会被复制到专用于正在运行的子进程的内存空间 fun(q, d3) 修改之前。如果子进程中没有修改d3,则子进程只保留父进程对d3的引用(这是高效的)。

现在,如果 d3 非常大,并且您想减少运行时间和内存需求,我只会将对 d3 的引用传递给您的 4 个子进程(即,不要在子进程中修改 d3 以避免副本),以及开始和停止行索引。然后 fun(d3, q, start_idx, stop_idx) 只会返回一个长度为 stop_idx - start_idx 的列表,您的父进程稍后会将其放回到名为 < 的原始 d3 列中强>计算。

关于Python 多处理 : Errors from different codes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790114/

相关文章:

python - 超过最大递归深度。多处理和 bs4

c++ - fork() 后子进程中处理 std::thread 终止的正确方法

Windows 上的 Python 2.7,所有多处理示例的 "assert main_name not in sys.modules, main_name"

python - yfinance 下载数据时返回错误

Python Tkinter 应用程序未正确退出

python - Selenium 远程 WebDriver

python - 不在python中写入文件

python - socket.recv(recv_size) 什么时候返回?

python - 使用并发 future python 3.5 处理大文件的最快方法

Python:给定2个进程A和B,从B调用A中的函数