NumPy memmap медленная загрузка небольшого фрагмента из большого файла только при первом чтении - PullRequest
0 голосов
/ 23 декабря 2018

Я использую карту памяти NumPy для загрузки небольшого количества данных из разных мест в большом двоичном файле (memmap'd, измененный, перевернутый, а затем около 2000x1000 точек, загруженных из приблизительно 2 ГБ двоичного файла).Есть пять файлов по 2 ГБ каждый со своим собственным объектом карты памяти.

Карты памяти создаются очень быстро.И часть данных из первых нескольких файлов извлекается очень быстро.Но затем он внезапно останавливается на четвертом и пятом файлах.Использование памяти остается низким, поэтому, похоже, что он не считывает весь файл в память, но доступ ввода-вывода из процесса высок.Это может легко занять десять или пятнадцать минут, чтобы это очистить, и тогда все будет идти так, как ожидалось.Последующий доступ ко всем картам памяти очень быстрый, включая загрузку данных, которые ранее не затрагивались.Использование памяти остается низким во всем.При закрытии и повторном запуске Python проблема не повторяется до перезагрузки (возможно, кеширование?).

Я на Windows 10 с Python 2.7.Есть мысли по устранению неполадок?

РЕДАКТИРОВАТЬ: В комментариях был запрос на тип формата файла и пример кода.К сожалению, я не могу предоставить точные детали;Однако я могу сказать это много.Формат файла содержит только двоичные значения int16 для трехмерного массива, которые можно изменить в формате [n1, n2, n3], где n * - длина для каждого измерения.Тем не менее, файлы разделены на 2 ГБ.Итак, они загружаются примерно так:

memmaps = []
for filename in filelist:
    memmaps.append(np.memmap(filename, dtype=np.int16, mode='r'))
    memmaps[-1] = memmaps[-1].reshape([len(memmaps[-1])/n2/n3, n2, n3])
    memmaps[-1] = np.transpose(memmaps[-1], [2,1,0])

Это, конечно, не самый чистый код в мире, но он обычно работает, за исключением этого, казалось бы, случайного замедления.У пользователя есть ползунок, который позволяет ему построить срез из этого массива как

image = np.zeros([n2, n1], dtype=np.int16)
#####
c = 0
for d in memmaps:
    image[:,c:(c+d.shape[2])] = d[slice,:,:]
    c = c + d.shape[2]

Я опускаю много деталей, но я думаю, что это захватывает наиболее важную информацию.

РЕДАКТИРОВАТЬ 2: Кроме того, я открыт для альтернативных подходов к решению этой проблемы.Моя конечная цель - интерактивное построение в реальном времени произвольного и относительно небольшого куска 2D-данных в виде изображения из большого набора 3D-данных, который может быть разбит на несколько двоичных файлов.В настоящее время я использую pyqtgraph с довольно разумными результатами, за исключением этой случайной проблемы.

...