簡體   English   中英

Python Pandas在多處理管理器之間共享DataFrames

[英]Python Pandas shared DataFrames across Multiprocessing Managers

我有一個multiprocessing.manager.BaseManager實現,共享資源是一個類,該類返回各種數據的DataFrames。 我遇到的問題是,由於熊貓不是線程安全的,因此進程共享它們正在處理的數據的實例。 這導致Python崩潰。

我嘗試做的是在多處理管理器類中MakeProxyType方法(請參閱: https : //github.com/python/cpython/blob/8c83c23fa32405aa9212f028d234f4129d105a23/Lib/multiprocessing/managers.py#L938 )來執行此操作:

for meth in exposed:
    if meth.startswith("load"):
        exec('''def %s(self, *args, **kwds):
        return self._callmethod(%r, args, kwds).copy()''' % (meth, meth), dic)
    else:
        exec('''def %s(self, *args, **kwds):
        return self._callmethod(%r, args, kwds)''' % (meth, meth), dic)

但是,它實際上並沒有給我數據副本。 當我查看輸出變量時,我看到一些變量共享相同的內存地址(表示它們具有相同的星號#):

Thread 1: 0xa225630 ***
Thread 2: 0xa245518 *
Thread 3: 0xa225518 *
Thread 4: 0xa225518 *
Thread 5: 0xa2284a8
Thread 6: 0xa225550 **
Thread 7: 0xa245550 **
Thread 8: 0xa245630 
Thread 9: 0xa225630 ***

當我嘗試使用進程內的熊貓操作數據時,這會引起問題。

有人可以幫我從這里出去嗎? 關於如何強制多處理管理器為我提供這些DataFrames的唯一實例,以便避免python崩潰的任何想法? 多處理管理器似乎是一個很棒的類-但是它的文檔非常薄。

所以我仍然不是問題的100%,但是在multiprocessing庫中有一個未記錄的類,稱為ThreadPoolhttps://github.com/python/cpython/blob/master/Lib/multiprocessing/pool.py )。 與啟動進程相比,啟動線程不僅具有更少的開銷,而且管理器現在還可以返回每個DataFrame不同副本!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM