Почему использование памяти дочерним процессом (многопроцессорность python) так отличается при совместном использовании ctypes.Structure со строкой, а не только со строкой?

Следующий код использует multiprocessing Array для совместного использования большого массива строк Unicode в разных процессах. Если я использую c_wchar_p в качестве типа, использование памяти дочерним процессом составляет около четверти памяти, используемой в родительском процессе (количество изменяется, если я изменяю количество записей в массиве).

Однако, если я использую ctypes.Structure с одним полем c_wchar_p , использование памяти дочерним процессом будет постоянным и очень низким, в то время как использование памяти родительским процессом удвоится.

import ctypes
import multiprocessing
import random
import resource
import time

a = None

class Record(ctypes.Structure):
    _fields_ = [('value', ctypes.c_wchar_p)]
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return '(%s)' % (self.value,)

def child(i):
    while True:
        print "%ik memory used in child %i: %s" % (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024, i, a[i])
        time.sleep(1)
        for j in xrange(len(a)):
            c = a[j]

def main():
    global a
    # uncomment this line and comment the next to switch
    #a = multiprocessing.Array(ctypes.c_wchar_p, [u'unicode %r!' % i for i in xrange(1000000)], lock=False)
    a = multiprocessing.Array(Record, [Record(u'unicode %r!' % i) for i in xrange(1000000)], lock=False)
    for i in xrange(5):
        p = multiprocessing.Process(target=child, args=(i + 1,))
        p.start()
    while True:
        print "%ik memory used in parent: %s" % (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024, a[0])
        time.sleep(1)

if __name__ == '__main__':
    main()

Использование c_wchar_p приводит к следующему выводу:

363224k memory used in parent: unicode 0!
72560k memory used in child 5: unicode 5!
72556k memory used in child 3: unicode 3!
72536k memory used in child 1: unicode 1!
72568k memory used in child 4: unicode 4!
72576k memory used in child 2: unicode 2!

Использование записи приводит к следующему выводу:

712508k memory used in parent: (unicode 0!)
1912k memory used in child 1: (unicode 1!)
1908k memory used in child 2: (unicode 2!)
1904k memory used in child 5: (unicode 5!)
1904k memory used in child 4: (unicode 4!)
1908k memory used in child 3: (unicode 3!)

Почему?

7
задан papercrane 21 January 2016 в 01:06
поделиться