@ Свен, Хм, никогда не задумывался об этом подходе, мне понадобится какой-то эксперимент, чтобы заставить его понять и понять, но это выглядит хорошо :)
лал некоторые базовые тесты производительности и потребления памяти, и мне было интересно, есть ли способ сделать вещи еще быстрее ...
У меня есть гигантский список из 70000 элементов с пустым ndarray и путь к файлу в кортеже в указанном списке.
Моя первая версия передала нарезанную копию списка каждому из процессов в многопроцессорном модуле python, но это увеличило бы использование оперативной памяти до более чем 20 гигабайт
Во второй версии я переместил его в глобальное пространство и получил к нему доступ через индекс, такой как foo [i], в цикле в каждом из моих процессов, который, кажется, помещал его в общую область памяти / семантику CoW с процессами, таким образом, он не взрывался использование памяти (остается на уровне ~ 3 гигабайта)
Однако, в соответствии с показателями производительности / трассировкой, кажется, что большая часть времени приложения теперь тратится в режиме «получения» ...
Поэтому мне было интересно, могу ли я каким-то образом превратить этот список в своего рода блокировку без чтения / чтения, чтобы я мог покончить с частью шага получения, чтобы еще больше ускорить доступ.
Изменить 1: Вот несколько верхних строчек профилирования приложения
ncalls tottime percall cumtime percall filename:lineno(function)
65 2450.903 37.706 2450.903 37.706 {built-in method acquire}
39320 0.481 0.000 0.481 0.000 {method 'read' of 'file' objects}
600 0.298 0.000 0.298 0.000 {posix.waitpid}
48 0.271 0.006 0.271 0.006 {posix.fork}
Изменить 2: Вот пример структуры списка:
# Sample code for a rough idea of how the list is constructed
sim = []
for root, dirs, files in os.walk(rootdir):
path = os.path.join(root, filename)
image= Image.open(path)
np_array = np.asarray(image)
sim.append( (np_array, path) )
# Roughly it would look something like say this below
sim = List( (np.array([[1, 2, 3], [4, 5, 6]], np.int32), "/foobar/com/what.something") )
В дальнейшем список SIM-карт будет доступен только для чтения.