簡體   English   中英

具有多處理功能的共享內存字符串數組

[英]Shared Memory Array of Strings with Multiprocessing

我正在嘗試對一些現有代碼進行多處理,我發現使用Pool對進程的數據進行酸洗/取消酸洗太慢了。 我認為對於我的情況, Manager會遇到同樣的問題,因為它在幕后進行了相同的酸洗。

為了解決這個問題,我試圖轉移到共享內存陣列。 為此,我需要一個字符串數組。 似乎multiprocessing.Array支持ctypes.c_char_p但我很難將其擴展到字符串數組中。 以下是我嘗試過的許多事情中的一些。

#!/usr/bin/python
import ctypes
import multiprocessing as mp
import multiprocessing.sharedctypes as mpsc
import numpy

# Tested possible solutions
ver = 1
if 1==ver:
    strings = mpsc.RawArray(ctypes.c_char_p, (' '*10, ' '*10, ' '*10, ' '*10))
elif 2==ver:
    tmp_strings = [mpsc.RawValue(ctypes.c_char_p, ' '*10) for i in xrange(4)]
    strings = mpsc.RawArray(ctypes.c_char_p, tmp_strings)
elif 3==ver:
    strings = []
    for i in xrange(4):
        strings.append( mpsc.RawValue(ctypes.c_char_p, 10) )

def worker(args):
    snum, lenarg = args
    string = '%s' % snum
    string *= lenarg
    strings[snum] = string
    return string

# Main progam
data = [(i, numpy.random.randint(1,10)) for i in xrange(3)]
print 'Testing version ', ver
print
print 'Single process'
for x in map(worker, data):
    print '%10s : %s' % (x, list(strings))
print

print 'Multi-process'
pool = mp.Pool(3)
for x in pool.map(worker, data):
    print '%10s : %s' % (x, list(strings))
    print '            ', [isinstance(s, str) for s in strings]

請注意,我使用multiprocessing.sharedctypes因為我不需要鎖定,它應該與multiprocessing.Array相當可互換

上面代碼的問題在於結果strings對象包含常規字符串,而不是來自mpsc.RawArray構造函數的共享內存字符串。 使用版本 1 和 2,您可以看到在進程外工作時數據是如何被打亂的(如預期的那樣)。 對我來說,版本 3 最初看起來像它,但你可以看到=只是將對象設置為常規字符串,雖然這適用於短期測試,但在較大的程序中它會產生問題。

似乎應該有一種方法來創建一個共享指針數組,其中指針指向共享內存空間中的字符串。 如果您嘗試使用c_str_p類型初始化c_str_p類型,並且我還沒有運氣直接操作底層地址指針,則c_void_p類型會抱怨。

任何幫助,將不勝感激。

首先,您的第三個解決方案不起作用,因為strings沒有被多處理部分改變,但已被單處理部分修改。 您可以通過評論您的單個流程部分來進行檢查。

其次,這將起作用:

import ctypes
import multiprocessing as mp
import multiprocessing.sharedctypes as mpsc
import numpy

strings = [mpsc.RawArray(ctypes.c_char, 10) for _ in xrange(4)]

def worker(args):
    snum, lenarg = args
    string = '%s' % snum
    string *= lenarg
    strings[snum].value = string
    return string

# Main progam
data = [(i, numpy.random.randint(1,10)) for i in xrange(4)]

print 'Multi-process'
print "Before: %s" % [item.value for item in strings]
pool = mp.Pool(4)
pool.map(worker, data)
print 'After : %s' % [item.value for item in strings]

輸出:

Multi-process
Before: ['', '', '', '']
After : ['0000000', '111111', '222', '3333']

暫無
暫無

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

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