У меня около 700 матриц, хранящихся на диске, каждая из которых содержит около 70 тыс. Строк и 300 столбцов.Memory-Mapping замедляется во времени, альтернативы?
Я должен загрузить части из этих матриц относительно быстро, около 1 тыс. Строк на матрицу, в другую матрицу, которую у меня есть в памяти. Самый быстрый способ, которым я нашел это, - использовать карты памяти, где изначально я могу загрузить 1k строк примерно за 0,02 секунды. Однако производительность не совсем согласована, и иногда загрузка занимает до 1 секунды на каждую матрицу!
Мой код выглядит следующим образом грубо:
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, :]
С линией по времени линии я решил, что это, безусловно, последняя строка, которая замедляет течение долгого времени.
Upadte: Заговор время загрузки дает различные результаты. Одно время это выглядело так, то есть деградация не была постепенной, а вместо этого прыгала после 400 файлов. Может ли это быть пределом ОС?
Но в другой раз он выглядел совсем иначе:
После нескольких тестовых прогонов, кажется, что второй участок является довольно типичным для развития производительности.
Кроме того, я попытался del X
после цикла, без какого-либо влияния. Также не удалось получить доступ к базовому Python mmap
через X._mmap.close()
.
Любые идеи относительно того, почему существует несогласованная производительность? Существуют ли более быстрые альтернативы для хранения & для получения этих матриц?
Похоже, что основной файл 'mmap' не закрывается при переходе к следующему файлу. Это дикая догадка, но я бы попробовал добавить 'del X' в конце цикла. Код для 'np.memmap' является читаемым Python, но для' mmap.mmap' нет. – hpaulj
Каков диапазон индексов и они отсортированы? То есть имеет значение, если 'indices_in_X' является' np.arange (1000) 'или' np.random.shuffe (np.arange (0, 70000, 70)) '. Кроме того, попробуйте сделать тайминги независимыми от эффектов кэширования файлов ОС: http://unix.stackexchange.com/q/87908 –
@morningsun Спасибо за ответ. Я попробовал сортировку 'indices_in_X', а также' indices_in_target', и я думаю, что это немного улучшает базовый уровень, но, казалось бы, случайные патчи для деградации все еще существуют. К сожалению, я работаю на общем сервере и не имею никаких привилегий sudo, поэтому я не могу очистить кеши. – fabian789