Bloquear somente leitura livre Lista em Python?
Eu fiz alguns benchmarks básicos de desempenho e consumo de memória e fiquei pensando se há alguma maneira de tornar as coisas ainda mais rápidas ...
Eu tenho uma lista gigante de 70.000 elementos com um ndarray numpy e o caminho do arquivo em uma tupla na referida lista.
Minha primeira versão passou uma cópia fatiada da lista para cada um dos processos no módulo multiprocesso python, mas explodiria o uso de memória ram para mais de 20 Gigabytes
A segunda versão, mudei para o espaço global e o acesso através de índices como foo [i] em um loop em cada um dos meus processos, que parece colocá-lo em uma área de memória compartilhada / semântica de COW com os processos, para que não exploda o uso da memória (permanece em ~ 3 Gigabytes)
No entanto, de acordo com os benchmarks de desempenho / rastreamento, parece que a grande maioria do tempo do aplicativo é gasta no modo "adquirir" ...
Então, eu estava pensando se há alguma maneira de transformar essa lista em algum tipo de bloqueio / leitura apenas, para que eu possa acabar com parte da etapa de aquisição para ajudar a acelerar o acesso ainda mais.
Editar 1: Aqui está a primeira linha de saída do perfil do aplicativo
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}
Edição 2: Aqui está um exemplo da estrutura da 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") )
A partir de agora, a lista do SIM deve ser somente leitura.