我有一段代码可以分析来自非常大(10-100GB)二进制文件的数据流。它运行良好,所以现在是时候开始优化了,目前磁盘IO是最大的瓶颈。
有两种类型的文件正在使用中。第一种类型的文件由16位整数流组成,必须在I / O之后进行缩放,以转换为物理上有意义的浮点值。我以块的形式读取文件,并通过一次读取一个16位代码,执行所需的缩放,然后将结果存储在数组中来读取数据块。代码如下:
int64_t read_current_chimera(FILE *input, double *current,
int64_t position, int64_t length, chimera *daqsetup)
{
int64_t test;
uint16_t iv;
int64_t i;
int64_t read = 0;
if (fseeko64(input, (off64_t)position * sizeof(uint16_t), SEEK_SET))
{
return 0;
}
for (i = 0; i < length; i++)
{
test = fread(&iv, sizeof(uint16_t), 1, input);
if (test == 1)
{
read++;
current[i] = chimera_gain(iv, daqsetup);
}
else
{
perror("End of file reached");
break;
}
}
return read;
}
chimera_gain函数只需要一个16位整数,然后对其进行缩放并返回双倍的存储空间。
第二种文件类型包含64位双精度数,但它包含两列,其中我只需要第一列。要做到这一点,我会双击双打并丢弃第二个双打。双重必须在使用前进行字节交换。我用来执行此操作的代码如下:
int64_t read_current_double(FILE *input, double *current, int64_t position, int64_t length)
{
int64_t test;
double iv[2];
int64_t i;
int64_t read = 0;
if (fseeko64(input, (off64_t)position * 2 * sizeof(double), SEEK_SET))
{
return 0;
}
for (i = 0; i < length; i++)
{
test = fread(iv, sizeof(double), 2, input);
if (test == 2)
{
read++;
swapByteOrder((int64_t *)&iv[0]);
current[i] = iv[0];
}
else
{
perror("End of file reached: ");
break;
}
}
return read;
}
任何人都可以建议一种阅读这些文件类型的方法,这种方法会比我目前要快得多吗?