Использование POSIX_FADV_DONTNEED для очистки numpy memmap - PullRequest
0 голосов
/ 20 июня 2020

Мы пытаемся решить проблему, подробно описанную в этой публикации , где загрузка данных из большого h5 приводила к заполнению кеша, а впоследствии вызывала подкачку, которая делала нашу машину непригодной для использования. Как обсуждалось в посте, мы попытались использовать os.posix_fadvise, чтобы установить совет для данных после загрузки.

При непосредственном индексировании набора данных h5, как показано ниже, вызов успешно предотвращает заполнение кеша:

#on init:
self.fd = open(trainval_dset_path[i], 'rb')
f = h5py.File(self.fd, "r")
hdf5_event_data = f["event_data"]

self.event_data = hdf5_event_data
self.offset = hdf5_event_data.id.get_offset()
self.dataset_size = hdf5_event_data.id.get_storage_size()
self.file_size = f.id.get_filesize()

#on __getitem__:
self.e = self.event_data[index,:,:,:19]
os.posix_fadvise(self.fd.fileno(), 0, self.filesizes, os.POSIX_FADV_DONTNEED)
# OR (both work)
# os.posix_fadvise(self.fds.fileno(), self.offsets, self.dataset_size, 
#                                      os.POSIX_FADV_DONTNEED)
return self.e

Однако при индексировании numpy memmap, как показано ниже, сам вызов posix занимает огромное количество времени, в результате чего время на выборку одной выборки увеличивается в десять раз по сравнению с индексированием набора данных h5. Это продолжает замедляться с дополнительными вызовами.

#on init:
self.fd = open(trainval_dset_path[i], 'rb')
f = h5py.File(self.fd, "r")
hdf5_event_data = f["event_data"]

self.event_data=np.memmap(trainval_dset_path[i], mode="r", shape=hdf5_event_data.shape, 
                          offset=hdf5_event_data.id.get_offset(), dtype=hdf5_event_data.dtype)
self.offset = hdf5_event_data.id.get_offset()
self.dataset_size = hdf5_event_data.id.get_storage_size()
self.file_size = f.id.get_filesize()

#__getitem__ as above

Кто-нибудь знает, почему поведение вызова posix между случаем индексации h5 и случаем numpy memmap так отличается? Кроме того, есть ли хорошая альтернатива для очистки мем-карты numpy, которая решила бы нашу исходную проблему без необходимости настраивать совет таким образом? Самым подходящим постом, который я нашел, был этот , но я не знаю, как его реализовать и решит ли он нашу проблему.

Пожалуйста, дайте мне знать, если потребуется дополнительная информация! Спасибо!

...