Ho fatto alcuni parametri di riferimento di base di prestazioni e consumo di memoria e mi chiedevo se c'è un modo per rendere le cose ancora più veloce ...Blocco gratuito di sola lettura Elenco in Python?
Ho un gigantesco elenco di 70.000 elemento con un ndarray numpy, e il percorso del file in una tupla nella suddetta lista.
La mia prima versione passò una copia a fette di lista per ciascuno dei processi in modulo python multiprocesso, ma sarebbe esploso l'utilizzo della RAM a più di 20 + Gigabyte
La seconda versione ho spostato nella spazio globale e accedervi tramite indice come foo [i] in un ciclo in ciascuno dei miei processi che sembra metterlo in una semantica di area di memoria/semantica condivisa con i processi in modo da non esplodere l'utilizzo della memoria (rimane a ~ 3 Gigabyte)
Tuttavia, in base ai benchmark/traccia delle prestazioni, sembra che la maggior parte del tempo di applicazione venga ora utilizzata per "acquisire" modalità ...
Così mi chiedevo se non v'è alcun modo che posso in qualche modo trasformare questa lista in una sorta di lockfree/lettura solo in modo che io possa fare via con parte della fase di acquisire per contribuire ad accelerare accedi ancora di più.
Edit 1: Ecco la top poche uscita di linea della profilatura delle app
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}
Edit 2: Ecco un esempio della struttura della lista:
# 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"))
Quindi d'ora in poi l'elenco SIM deve essere letto solo
Il mio problema è che ho bisogno di un modo per memorizzare un ndarray + filepath numpy. La mia comprensione della roba di Array è che memorizza solo 1 elemento, ad esempio 'c' non può memorizzare "char" – Pharaun
@Pharaun: Forse non ho ottenuto correttamente la struttura dell'elenco. Potresti renderlo più esplicito nella tua domanda? Sono abbastanza sicuro che la classe 'Array' possa essere utilizzata per la tua applicazione. –
@Sven, ho aggiornato la domanda di cui sopra con un campione approssimativo di come la lista è costruita sotto edit2 in modo da dare un'idea ... – Pharaun