0

使用 hdf5dotnet 在现有数据集上写入时遇到问题。我在运行时写了很多次,只有第一次写得很好。第二个覆盖第一个数据。正如您在屏幕上看到的,第 4 个第一个值是正确的,但第 4 个最后一个值不正确,但通常会为其创建空间。我忘了说,但值是双重类型。

截屏

我正在使用的代码就在那里,我是这个技术的新手,如果你有一个想法,我会很高兴地接受它!请给我任何关于在我的数据集末尾写入而不覆盖的建议。

if (data.Length <= 0)
  return;
try {
  H5DataSpaceId dataSpaceId = H5D.getSpace(dataSetId);
  int rank = H5S.getSimpleExtentNDims(dataSpaceId);
  long[] dims = H5S.getSimpleExtentDims(dataSpaceId);
  H5D.getCreatePropertyList(dataSetId);
  long[] dims_extended = dims[0] is 1 ? new long[] { (dims[0] + data.Length) - 1 } : new long[] { (dims[0] + data.Length) };
  H5D.setExtent(dataSetId, dims_extended);
  H5S.selectHyperslab(dataSpaceId, H5S.SelectOperator.SET, new long[] { dims[0] }, new long[] { data.Length });
  H5S.create_simple(rank, dims_extended);
  H5Array < float > hdf_data = new H5Array<float>(data);
  H5DataTypeId dataTypeId = H5D.getType(dataSetId);
  H5D.write(dataSetId, dataTypeId, hdf_data);
} catch (HDFException e) {
  MessageBox.Show(e.Message);
}
4

1 回答 1

0

我的错误是创建的新数据空间的大小并在 selectHyperslab 调用后获取数据空间id

                int rank = H5S.getSimpleExtentNDims(dataSpaceId);
                long[] dims = H5S.getSimpleExtentDims(dataSpaceId);
                Console.WriteLine("il est ici le value mec: {0}", dims[0]);
                H5PropertyListId propertiesId = H5D.getCreatePropertyList(dataSetId);
                long[] block = new long[] { 1, 1 };
                long[] dims_extended = new long[] { (dims[0] + data.Length), 1 };
                H5D.setExtent(dataSetId, dims_extended);
                dataSpaceId = H5D.getSpace(dataSetId);
                H5S.selectHyperslab(dataSpaceId, H5S.SelectOperator.SET, new long[] { dims[0], 0 }, new long[] { dims_extended[0] - dims[0], 1 });
                long[] newdims = H5S.getSimpleExtentDims(dataSpaceId);
                H5DataSpaceId SpaceId = H5S.create_simple(1, new long[] { dims_extended[0] - dims[0], 1 });
                H5Array<double> hdf_data = new H5Array<double>(data);
                H5DataTypeId dataTypeId = H5D.getType(dataSetId);
                H5D.write(dataSetId, dataTypeId, SpaceId, dataSpaceId, new H5PropertyListId(H5P.Template.DEFAULT), hdf_data);
                H5S.close(dataSpaceId); ```
于 2021-04-14T14:15:49.567 回答