Параллельный ввод-вывод в R с rhdf5

У меня есть большой объем данных в кадрах данных R, которые я хотел бы записать в файл HDF5 параллельно. В моих первоначальных экспериментах файл hdf5 был поврежден, предположительно, из-за того, что параллельный ввод-вывод не включен в rhdf5. Можно ли сделать параллельный ввод-вывод из R с помощью rhdf5?

Вот пример того, что я пытаюсь сделать:

library(parallel)
library(Rmpi)
library(rhdf5)

nwrites = 10000
db_name = 'testing_parallel_io.h5'

if(file.exists(db_name))unlink(db_name)
h5createFile(db_name)

write_data = function(index, db_name){

    suppressPackageStartupMessages(require(rhdf5))

    nr = 1000
    nc = 10
    df = as.data.frame(matrix(rnorm(nr*nc),nr,nc))

    group_name = sprintf('group%05d',index)
    dataset_name = sprintf('%s/A',group_name)

    h5createGroup(db_name, group_name)
    h5write(df, db_name, dataset_name)

    return(0)
}

cl = makeCluster(detectCores(),type='MPI')
res = parSapply(cl, 1:nwrites, write_data, db_name)

stopCluster(cl)
mpi.quit()

Когда я запускаю это, я получаю всевозможные ошибки от hdf5, например:

HDF5-DIAG: Error detected in HDF5 (1.8.7) thread 0:
  #000: H5D.c line 170 in H5Dcreate2(): unable to create dataset
    major: Dataset
    minor: Unable to initialize object
  #001: H5Dint.c line 431 in H5D_create_named(): unable to create and link to dataset
    major: Dataset
    minor: Unable to initialize object
  #002: H5L.c line 1640 in H5L_link_object(): unable to create new link to object
    major: Links
    minor: Unable to initialize object
  #003: H5L.c line 1884 in H5L_create_real(): can't insert link
    major: Symbol table
    minor: Unable to insert object
  #004: H5Gtraverse.c line 905 in H5G_traverse(): internal path traversal failed
    major: Symbol table
    minor: Object not found
  #005: H5Gtraverse.c line 799 in H5G_traverse_real(): component not found
    major: Symbol table
    minor: Object not found

person cameron.bracken    schedule 11.09.2014    source источник
comment
Было бы неплохо знать, что то, что вы пытаетесь сделать, не работает, но моя первая мысль заключается в том, что если вы передаете свои подключения к рабочим узлам как переменные, это не сработает. Соединения будут разрываться в процессе сериализации/десериализации доступа к узлам. Я задал аналогичный вопрос о соединениях с базой данных, но ответ можно применить и к соединениям с файлами. stackoverflow.com/questions/24541822/ . Вам просто нужно определить свои подключения к рабочим процессам перед запуском процедуры.   -  person DMT    schedule 12.09.2014
comment
Я добавил пример того, что я делаю. Я не передаю никаких дескрипторов файлов или соединений, которые они должны открывать и закрывать после каждой записи.   -  person cameron.bracken    schedule 12.09.2014
comment
Спасибо, это полезно. Я проделал кучу работы с parallel, но не с rhdf5. Глядя на ошибки, я задаюсь вопросом, создает ли группа создания или вызов записи в функции блокировку файла db_name, чтобы только один процесс мог использовать его одновременно? Это объясняет, почему нельзя сделать ссылку. В качестве теста вы можете инициализировать только один узел и посмотреть, работает ли он. Затем инициализируйте два и повторите попытку. Если один работает, а два нет, я, вероятно, на правильном пути, если ни один из них не работает, то, надеюсь, появится кто-то умнее меня!   -  person DMT    schedule 12.09.2014
comment
Спасибо, в сериале все работает. Я почти уверен, что эти ошибки связаны с тем, что пакет rhdf5 не поддерживает параллельный ввод-вывод. Я надеюсь, что кто-то умнее меня сможет это исправить :)   -  person cameron.bracken    schedule 12.09.2014