在C中,以最快的方式在Integer的二进制文件中查找和计算特定值的方法?

问题描述 投票:0回答:2

我有一个二进制文件,其中存储了多个int32值块。每个块均以值999999999开头,例如

9999999991个5610299999999943580999999999等。

有人可以建议以最快的方式计算二进制文件中999999999的数量吗?我当然可以使用for循环进行迭代并计算这些值,但是我认为这不是最佳方法。我要执行此操作的原因是要预先分配2D数组。

谢谢

c find binaryfiles
2个回答
0
投票

由于块定界符代码可以出现在整个文件的任何位置,因此您必须阅读并处理整个文件。假设该程序没有做任何荒唐的事情,则所涉及的I / O成本将主导整个程序的总成本。

我当然可以使用for循环进行迭代并计算这些值,但是我认为这不是最好的方法。

为什么不是最好的方法?当然,细节很重要,但是您必须将每个4字节块(解释为int32_t的表示形式)与值999999999进行比较。这是一个固有的迭代过程,可以通过for很好地表示出来。 ,whiledo循环。我会这样写:

#define BUFFER_SIZE 1024
#define BLOCK_HEADER 999999999

FILE *input = fopen(the_file_name);
int32_t numbers[BUFFER_SIZE];
size_t num_blocks = 0;
size_t count;

for (count = fread(numbers, 4, BUFFER_SIZE, input);
        count > 0;
        count = fread(numbers, 4, BUFFER_SIZE, input)) {
    for (size_t i = 0; i < count; i++) {
        if (numbers[i] == BLOCK_HEADER) num_blocks++;
    }
}

-1
投票

可能我建议OpenMP以提高速度。 OpenMP是在程序中使用多重处理的真正简便方法。 for循环方法仍然相同。您只需在for循环上方添加#pragma omp parallel for行,然后使用-fopenmp进行编译。这将告诉编译器将迭代分为多个块,并在多个内核上并行进行处理。我假设当值是您想要的值时,您会使用某种++count。您还必须将其声明为共享。有关此内容以及如何使用OpenMP的更多信息,请参考此link

但是除此之外,C中没有更好的方法可以做到这一点。我认为该链接有些过时,因此您可能还会研究SIMD和矢量化。 OpenMP还具有添加此功能的简单方法。

© www.soinside.com 2019 - 2024. All rights reserved.