是否可以仅在RAM中创建HDF文件并将其作为字节数组检索?

时间:2018-01-31 16:32:46

标签: c# hdf5 hdf

在C#中使用HDF.PInvoke我希望将数据存储在HDF5文件中,但我不想立即将文件写入磁盘。相反,我想将文件作为字节数组传递给另一个类,该类处理与存储介质的交互。

据我所知,这应该可以通过HDF CORE驱动程序实现,因为它允许您在内存中创建HDF文件而无需将其写入磁盘。

这就是我被困的地方:

public byte[] ConvertToHDF(object data)
{
    long fileID;

    // create HDF5 file, continuously growing in 0x1000 byte chunks
    {
        long propertyListFileAccess = H5P.create(H5P.FILE_ACCESS);
        H5P.set_fapl_core(propertyListFileAccess, (IntPtr)0x1000, 0);

        fileID = H5F.create("temporaryHDF", H5F.ACC_TRUNC,
            H5P.DEFAULT, propertyListFileAccess);

        H5P.close(propertyListFileAccess);
    }

    // store the data in the HDF file
    StoreHDF(fileID, data);

    // create byte array of fitting size
    ulong size = 0;
    H5F.get_filesize(fileID, ref size);
    byte[] binary = new byte[size];

    // fill binary with the HDF file
    ...

    return binary;
}

那么有没有办法在字节数组中获取HDF文件而不将其存储在光盘上?我只在一个块中使用HDF文件而只是使用它而不是将其复制到字节数组的解决方案会更好。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。

此外,在问题中获得字节数组的适当大小的方法是不准确的,它可能导致数组大于必要的数组。下面的内容是准确的。

以下代码旨在替换// create byte array of fitting size// fill binary with the HDF file

下面的代码
byte[] fileInRAM;

// make sure the HDF file is up to date
H5F.flush(fileID, H5F.scope_t.GLOBAL);

// retrieve copy H5F
{
    // create properly sized byte array for the file
    IntPtr sizePointer = (IntPtr)null;
    sizePointer = H5F.get_file_image(fileID, (IntPtr)null, ref sizePointer);
    fileInRAM = new byte[(int)sizePointer];

    // tell Garbage Collector to leave the byte array where it is
    GCHandle handle = GCHandle.Alloc(fileInRAM, GCHandleType.Pinned);
    IntPtr filePointer = handle.AddrOfPinnedObject();

    // get file image
    H5F.get_file_image(fileID, filePointer, ref sizePointer);

    // allow the Garbage Collector to do its work again
    handle.Free();
}

来源:https://support.hdfgroup.org/HDF5/doc/Advanced/FileImageOperations/HDF5FileImageOperations.pdf