【发布时间】:2015-11-14 07:44:37
【问题描述】:
我在 C# 中使用 HDF5DotNet,并且我有一个非常大的数组(几 GB),我想写入一个 HDF5 文件。它太大了,无法将整个东西存储在内存中,所以我一次生成它的区域并想把它们写出来,但是当它被读回时,它仍然看起来像一个大数组。我知道 HDF5 可以做到这一点,但 .NET API 的文档有些稀疏。
我编写了一些简短的示例代码,其中包含一个 5 x 3 数组,其中填充了值 1..15:
const int ROWS = 5;
const int COLS = 3;
static void Main(string[] args)
{
WriteWholeArray();
WriteArrayByRows();
ushort[,] array = ReadWholeArray();
}
static void WriteWholeArray()
{
H5FileId h5 = H5F.create(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.h5"), H5F.CreateMode.ACC_TRUNC);
H5DataSpaceId dsi = H5S.create_simple(2, new long[] { ROWS, COLS });
H5DataSetId dataset = H5D.create(h5, "array", new H5DataTypeId(H5T.H5Type.NATIVE_USHORT), dsi);
ushort[,] array = new ushort[ROWS, COLS];
ushort value = 1;
for(int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i, j] = value++;
}
}
H5D.write<ushort>(dataset, new H5DataTypeId(H5T.H5Type.NATIVE_USHORT), new H5Array<ushort>(array));
H5D.close(dataset);
H5F.close(h5);
}
static void WriteArrayByRows()
{
H5FileId h5 = H5F.create(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.h5"), H5F.CreateMode.ACC_TRUNC);
H5DataSpaceId dsi = H5S.create_simple(2, new long[] { ROWS, COLS });
H5DataSetId dataset = H5D.create(h5, "array", new H5DataTypeId(H5T.H5Type.NATIVE_USHORT), dsi);
ushort[,] array = new ushort[ROWS, COLS];
ushort value = 1;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i, j] = value++;
}
}
for(int i = 0; i < array.GetLength(0); i++)
{
H5S.selectHyperslab(dsi, H5S.SelectOperator.SET, new long[] { i, 0 }, new long[] { 1, array.GetLength(1) });
ushort[,] row = new ushort[1, array.GetLength(1)];
for(int j = 0; j < array.GetLength(1); j++)
{
row[0, j] = array[i, j];
}
H5D.write<ushort>(dataset, new H5DataTypeId(H5T.H5Type.NATIVE_USHORT), new H5Array<ushort>(row));
}
H5D.close(dataset);
H5F.close(h5);
}
static ushort[,] ReadWholeArray()
{
H5FileId h5 = H5F.open(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.h5"), H5F.OpenMode.ACC_RDONLY);
ushort[,] array = new ushort[ROWS, COLS];
H5Array<ushort> h5_array = new H5Array<ushort>(array);
H5DataSetId dataset = H5D.open(h5, "array");
H5D.read<ushort>(dataset, new H5DataTypeId(H5T.H5Type.NATIVE_USHORT), h5_array);
H5D.close(dataset);
H5F.close(h5);
return (array);
}
当我一次写入整个数组时,它可以正常读取。当我尝试按行写入时,我读回的数组有一些正确的值(在错误的元素中)、一些零和一些疯狂的值(例如 43440)。有人可以告诉我如何正确执行此操作吗?
【问题讨论】:
标签: c# .net multidimensional-array hdf5