У меня есть большой объем данных в кадрах данных 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