Это действительно интересно, поскольку сейчас я сталкиваюсь с аналогичной проблемой.
Performace
Чтобы исследовать проблему более подробно, я создал следующий файл
import h5py
import numpy as np
def one_file(shape=(4000, 4000), n=1000):
h5f = h5py.File('data.h5', 'w')
for i in xrange(n):
dataset = np.random.random(shape)
dataset_name = 'dataset_{:08d}'.format(i)
h5f.create_dataset(dataset_name, data=dataset)
print i
h5f.close()
def more_files(shape=(4000, 4000), n=1000):
for i in xrange(n):
file_name = 'data_{:08d}'.format(i)
h5f = h5py.File(file_name, 'w')
dataset = np.random.random(shape)
h5f.create_dataset('dataset', data=dataset)
h5f.close()
print i
Затем в IPython
>>> from testing import one_file, more_files
>>> %timeit one_file(n=25) # with n=25, the resulting file is 3.0GB
1 loops, best of 3: 42.5 s per loop
>>> %timeit more_files(n=25)
1 loops, best of 3: 41.7 s per loop
>>> %timeit one_file(n=250)
1 loops, best of 3: 7min 29s per loop
>>> %timeit more_files(n=250)
1 loops, best of 3: 8min 10s per loop
Разница для меня весьма удивительна, поскольку n=25
иметь больше файлов быстрее, однако это уже не правда для большего количества наборов данных.
Опыт
Как отмечали другие в комментариях, вероятно, нет правильного ответа, поскольку это очень специфическая проблема. Я использую файлы hdf5 для своих исследований в области физики плазмы. Не знаю, поможет ли это вам, но могу поделиться своим опытом с hdf5.
Я запускаю множество симуляций и выводю данные для данной симуляции, которые используются для перехода к одному файлу hdf5. Когда симуляция закончилась, она выгружала свое состояние в этот файл hdf5, так что позже я смог взять это состояние и расширить симуляцию с этой точки (я мог бы также изменить некоторые параметры, и мне не нужно начинать с нуля). Результат этого моделирования снова попал в тот же файл. Это было здорово - у меня был только один файл для одной симуляции. Однако у этого подхода есть определенные недостатки:
- Когда симуляция дает сбой, вы получаете неполный файл - вы не можете начать новую симуляцию из этого файла.
- Нет простого способа, как безопасно заглянуть в файл hdf5, когда другой процесс записывает в этот файл. Если случится так, что вы пытаетесь читать из, а другой процесс выполняет запись, вы получаете поврежденный файл, и все ваши данные теряются!
- Я не знаю простого способа, как вы можете удалить группы из файла (я кто-нибудь знает способ, дайте мне знать). Итак, если мне нужно реструктурировать файл, мне нужно создать из него новый (
h5copy
, h5repack
, ...).
Итак, я пришел к такому подходу, который работает намного лучше:
- Я периодически сбрасываю состояние из симуляции и после этого записываю в новый файл. Если симуляция дает сбой, мне нужно удалить только последний файл, и я не теряю много времени процессора.
- В настоящее время я рисую только данные из всех файлов, кроме последнего. Обратите внимание, что есть другой способ: см. здесь, но мой подход определенно проще и Я согласен с этим.
- Намного лучше обрабатывать больше маленьких файлов, чем один огромный файл - вы видите прогресс и так далее.
Надеюсь это поможет.
person
ziky
schedule
08.11.2015