首页 > 解决方案 > 如何读取 hdf5 (Hdfsl) 文件(一列读取)读取(大尺寸文件)

问题描述

我正在使用带有 C# 的 HDF5DotNet,我只能读取完整数据作为数据集中的附加图像。hdf5文件太大了,将近1.4GB,如果我把整个数组加载到内存中就会内存不足。

我想从一列中读取所有数据

double[] values = new double[203572];

string m_Doc_01 = "data/sample/line";

HDFql.Execute("USE DIRECTORY " + "\"" + File_Directory + "\""); 
HDFql.Execute("USE FILE " + "\"" + File_Name + "\"");
HDFql.Execute("CREATE CHUNKED(1, 203572) DATASET my_dataset_BS AS DOUBLE(2050, 203572)");

如何“m_Doc_01 ==> my_dataset_BS”数据??????

for (int i = 0; i < 2050; i++)
    {
      HDFql.Execute("SELECT FROM " + "\"" + m_Doc_01 + "\"" + "(1:::1)  INTO MEMORY " + HDFql.VariableRegister(values));
    }

在此处输入图像描述

标签: hdf5hdfql

解决方案


要阅读您在屏幕截图中突出显示的列(即第 0 列),您必须将 hyperslab 更改为(请注意 0):

HDFql.Execute("SELECT FROM " + "\"" + m_Doc_01 + "\"" + "(, 0:::1)  INTO MEMORY " + HDFql.VariableRegister(values));

也就是说,如果您想遍历数据集并一次读取一列,请执行以下操作(最好values在循环开始之前注册变量并在循环完成后取消注册 - 这将提高性能):

number = HDFql.VariableRegister(values);

for(int i = 0; i < 2050; i++)
{ 
    HDFql.Execute("SELECT FROM " + "\"" + m_Doc_01 + "\"" + "(, " + i + ":::1)  INTO MEMORY " + number);

    // do something with variable "values" (which contains the values of column #i)
}

HDFql.VariableUnregister(values);

推荐阅读