O mapeamento de memória diminui com o tempo, alternativas?
Eu tenho cerca de 700 matrizes armazenadas em disco, cada uma com cerca de 70 mil linhas e 300 colunas.
Eu tenho que carregarpartes dessas matrizes relativamente rapidamente, em torno de 1k linhas por matriz, em outra matriz que tenho na memória. A maneira mais rápida que encontrei para fazer isso é usando mapas de memória, onde inicialmente posso carregar as linhas de 1k em cerca de 0,02 segundos. No entanto, o desempenho não é consistente e, às vezes, o carregamento leva até 1 segundo por matriz!
Meu código fica assim:
target = np.zeros((7000, 300))
target.fill(-1) # allocate memory
for path in os.listdir(folder_with_memmaps):
X = np.memmap(path, dtype=_DTYPE_MEMMAPS, mode='r', shape=(70000, 300))
indices_in_target = ... # some magic
indices_in_X = ... # some magic
target[indices_in_target, :] = X[indices_in_X, :]
Com o tempo linha a linha, determinei que é definitivamente a última linha que diminui com o tempo.
Upadte: Plotar os tempos de carregamento fornece resultados diferentes. Uma vez, ficou assim, ou seja, a degradação não foi gradual, mas saltou após precisamente 400 arquivos. Poderia ser algum limite de SO?
Mas outra vez parecia completamente diferente:
Depois de mais alguns testes, parece que o segundo gráfico é bastante típico do desenvolvimento de desempenho.
Além disso, tenteidel X
após o loop, sem nenhum impacto. Nem acessar o Python subjacentemmap
através daX._mmap.close()
trabalhos.
Alguma idéia de por que há desempenho inconsistente? Existem alternativas mais rápidas para armazenar e recuperar essas matrizes?