コード例 #1
0
        public void CanReadDataset_External(string datasetName)
        {
            // INFO:
            // HDF lib says "external storage not supported with chunked layout". Same is true for compact layout.

            TestUtils.RunForAllVersions(version =>
            {
                // Arrange
                var absolutePrefix = datasetName == "absolute"
                    ? Path.GetTempPath()
                    : string.Empty;

                var externalFilePrefix = datasetName == "prefix"
                   ? Path.GetTempPath()
                   : null;

                var datasetAccess = new H5DatasetAccess()
                {
                    ExternalFilePrefix = externalFilePrefix
                };

                var filePath = TestUtils.PrepareTestFile(version, fileId => TestUtils.AddExternalDataset(fileId, datasetName, absolutePrefix, datasetAccess));
                var expected = TestData.MediumData.ToArray();

                for (int i = 33; i < 40; i++)
                {
                    expected[i] = 0;
                }

                // Act
                using var root = H5File.OpenReadCore(filePath, deleteOnClose: true);
                var parent     = root.Group("external");
                var dataset    = parent.Dataset(datasetName);
                var actual     = dataset.Read <int>();

                // Assert
                Assert.True(actual.SequenceEqual(expected));
            });
        }
コード例 #2
0
        public void CanReadDataset_External(string datasetName)
        {
            TestUtils.RunForAllVersions(version =>
            {
                // Arrange
                var absolutePrefix = datasetName == "absolute"
                    ? Path.GetTempPath()
                    : string.Empty;

                var externalFilePrefix = datasetName == "prefix"
                   ? Path.GetTempPath()
                   : null;

                var datasetAccess = new H5DatasetAccess()
                {
                    ExternalFilePrefix = externalFilePrefix
                };

                var filePath = TestUtils.PrepareTestFile(version, fileId => TestUtils.AddExternalDataset(fileId, datasetName, absolutePrefix, datasetAccess));
                var expected = TestData.MediumData;

                for (int i = 33; i < 40; i++)
                {
                    expected[i] = 0;
                }

                // Act
                using var root = H5File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, deleteOnClose: true);
                var parent     = root.Group("external");
                var dataset    = parent.Dataset(datasetName);
                var actual     = dataset.Read <int>();

                // Assert
                Assert.True(actual.SequenceEqual(expected));
            });
        }
コード例 #3
0
        public static unsafe void AddExternalDataset(long fileId, string datasetName, string absolutePrefix, H5DatasetAccess datasetAccess)
        {
            long res;

            var bytesoftype = 4;
            var dcpl_id     = H5P.create(H5P.DATASET_CREATE);
            var dapl_id     = H5P.create(H5P.DATASET_ACCESS);

            res = H5P.set_layout(dcpl_id, H5D.layout_t.CONTIGUOUS);

            // a (more than one chunk in file)
            var pathA = H5Utils.ConstructExternalFilePath(Path.Combine(absolutePrefix, $"{datasetName}_a.raw"), datasetAccess);

            if (File.Exists(pathA))
            {
                File.Delete(pathA);
            }

            res = H5P.set_external(dcpl_id, pathA, new IntPtr(120), (ulong)(10 * bytesoftype));
            res = H5P.set_external(dcpl_id, pathA, new IntPtr(80), (ulong)(10 * bytesoftype));
            res = H5P.set_external(dcpl_id, pathA, new IntPtr(0), (ulong)(10 * bytesoftype));

            // b (file size smaller than set size)
            var pathB = H5Utils.ConstructExternalFilePath(Path.Combine(absolutePrefix, $"{datasetName}_b.raw"), datasetAccess);

            if (File.Exists(pathB))
            {
                File.Delete(pathB);
            }

            res = H5P.set_external(dcpl_id, pathB, new IntPtr(0), (ulong)(10 * bytesoftype));

            // c (normal file)
            var pathC = H5Utils.ConstructExternalFilePath(Path.Combine(absolutePrefix, $"{datasetName}_c.raw"), datasetAccess);

            if (File.Exists(pathC))
            {
                File.Delete(pathC);
            }

            res = H5P.set_external(dcpl_id, pathC, new IntPtr(0), (ulong)((TestData.MediumData.Length - 40) * bytesoftype));

            // write data
            if (datasetAccess.ExternalFilePrefix is not null)
            {
                H5P.set_efile_prefix(dapl_id, datasetAccess.ExternalFilePrefix);
            }

            TestUtils.Add(ContainerType.Dataset, fileId, "external", datasetName, H5T.NATIVE_INT32, TestData.MediumData.AsSpan(), apl: dapl_id, cpl: dcpl_id);

            // truncate file b
            using (var fileStream2 = File.OpenWrite(pathB))
            {
                fileStream2.SetLength(10);
            };

            res = H5P.close(dapl_id);
            res = H5P.close(dcpl_id);
        }
コード例 #4
0
 public H5D_Chunk4_Implicit(H5Dataset dataset, DataLayoutMessage4 layout, H5DatasetAccess datasetAccess) :
     base(dataset, layout, datasetAccess)
 {
     //
 }
コード例 #5
0
 public H5Dataset_Chunk_Single_Chunk4(H5Dataset dataset, DataLayoutMessage4 layout, H5DatasetAccess datasetAccess) :
     base(dataset, layout, datasetAccess)
 {
     //
 }