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

Is it possible to create an HDF file solely in RAM and retrieve it as byte array?

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

据我所知,这应该可以通过 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文件呢?我将 HDF 文件放在一个块中并且可以简单地使用它而不是将其复制到字节数组的解决方案会更好。

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

此外,问题中获取字节数组适当大小的方法不准确,可能导致数组大于需要的大小。下面那个是准确的。

以下代码旨在替换下面的代码 // 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