Сохранение в hdf5save создает нечитаемый файл

Я пытаюсь сохранить массив как файл HDF5 с помощью R, но безуспешно.

Чтобы попытаться диагностировать проблему, я запустил example(hdf5save). В результате был успешно создан файл HDF5, который я мог легко читать с h5dump.

Когда я затем запустил код R вручную, я обнаружил, что он не работает. Код, который я запускал, был точно таким же, как в примере сценария (за исключением изменения имени файла, чтобы избежать перезаписи). Вот код:

(m <- cbind(A = 1, diag(4)))
ll <- list(a=1:10, b=letters[1:8]);
l2 <- list(C="c", l=ll); PP <- pi
hdf5save("ex2.hdf", "m","PP","ll","l2")
rm(m,PP,ll,l2)  # and reload them:
hdf5load("ex2.hdf",verbosity=3)
m        # read from "ex1.hdf"; buglet: dimnames dropped
str(ll)
str(l2)

и вот сообщение об ошибке от h5dump:

h5dump error: unable to open file "ex2.hdf"

У кого-нибудь есть идеи? Я в полном недоумении.

Спасибо


person matt    schedule 09.02.2011    source источник


Ответы (2)


У меня была эта проблема. Я не уверен в причине, как и разработчики hdf5. Авторы пакета R не ответили.

Работающие альтернативы

За время, прошедшее с момента моего первоначального ответа, пакет hdf5 был заархивированы, и подходящие альтернативы (h5r, rhdf5 и ncdf4) have been created; I am currently usingncdf4`:

  1. Поскольку netCDF-4 использует hdf5 в качестве уровня хранения, ncdf4 Пакет предоставляет интерфейс как для netCDF-4, так и для hdf5.
  2. Пакет h5r с R> = 2.10
  3. пакет rhdf5 доступен на BioConductor.

Временные решения Два функциональных, но неудовлетворительных решения, которые я использовал, прежде чем нашел альтернативы, указанные выше:

  1. Установите R 2.7, hdf5 версии 1.6.6, R hdf5 v1.6.7 и zlib1g версии 1: 1.2.3.3 и используйте это при записи файлов (это было моим решением до перехода на библиотеку ncdf4).
  2. Используйте h5totxt в командной строке из программы [hdf5utils] [1] (требуется использование bash и переписывание кода R)

Минимальная воспроизводимая демонстрация проблемы:

Вот воспроизводимый пример, который отправляет ошибку

Первая сессия R

library(hdf5)
dat <- 1:10
hdf5save("test.h5","dat")
q()
n # do not save workspace

Вторая сессия R:

library(hdf5)
hdf5load("test.h5")

вывод:

HDF5-DIAG: Error detected in HDF5 library version: 1.6.10 thread
47794540500448.  Back trace follows.
 #000: H5F.c line 2072 in H5Fopen(): unable to open file
   major(04): File interface
   minor(17): Unable to open file
 #001: H5F.c line 1852 in H5F_open(): unable to read superblock
   major(04): File interface
   minor(24): Read failed
 #002: H5Fsuper.c line 114 in H5F_read_superblock(): unable to find file
signature
   major(04): File interface
   minor(19): Not an HDF5 file
 #003: H5F.c line 1304 in H5F_locate_signature(): unable to find a valid
file signature
   major(05): Low-level I/O layer
   minor(29): Unable to initialize object
Error in hdf5load("test.h5") : unable to open HDF file: test.h5
person David LeBauer    schedule 10.02.2011
comment
Спасибо за ваши решения, я думаю, что ваш второй вариант мне подходит лучше всего. Мне не удалось найти программу hdf5tools, но я нашел h5utils который содержит программу под названием h5fromtxt, которая, кажется, делает то, что я хочу. - person matt; 10.02.2011
comment
@Matt Я обновил свой ответ и хотел сказать h5utils, очень хороший набор инструментов. Я обнаружил, что h5totxt test.h5 работал с файлами, для которых h5load('test.h5') не работал (поэтому запись не читается только R, не обязательно поврежденной). - person David LeBauer; 10.02.2011
comment
Похоже, что команда hdf5save работает только изредка, и, похоже, для этого нет ни рифмы, ни причины. По крайней мере (благодаря вам) у нас теперь есть воспроизводимый образец кода, который я / мы можем взять в их трекер ошибок (или попытаться исправить, я предполагаю, что это открытый исходный код). Я все еще на работе, но сделаю это, когда вернусь домой. Ваше здоровье, - person matt; 10.02.2011
comment
Я считаю, что это связано с тем, как on.exit изменил сообщение R 2.8. Из-за этого функция hdf5cleanup () больше не вызывается, что, вероятно, оставляет файл в плохом состоянии. - person frankc; 24.07.2012
comment
@frank есть ли простое решение? Есть ли причина, по которой h5totxt все еще работает? - person David LeBauer; 24.07.2012
comment
@ мое исправление заключалось в использовании h5r вместо hdf5 ... я не мог найти способ исправить это, не меняя код, и для меня это не стоило - person frankc; 25.07.2012

Я также столкнулся с той же проблемой и нашел разумное решение.

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

Я нашел одно решение - сделать hdf5save отдельной функцией. Назначьте переменные в globalenv (), затем вызовите hdf5save и выйдите из функции. Когда функция завершается, кажется, что память очищается, что заставляет библиотеку hdf5 очищать буфер и финализировать файл.

Надеюсь это поможет!

person mindmatters    schedule 13.03.2012