В C Самый быстрый способ найти и посчитать указанные c значения в двоичном файле целых чисел? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть двоичный файл, который хранит несколько блоков значений int32. Каждый блок начинается со значения 999999999, например,

999999999 1 5 6 10 2 999999999 4 3 5 8 0 999999999 et c ..

Может кто-нибудь предложить самый быстрый способ подсчета числа 999999999 в двоичном файле? Конечно, я могу выполнить итерацию для l oop и посчитать эти значения, но я предполагаю, что это не лучший подход. Причина, по которой я хочу сделать это, состоит в том, чтобы предварительно выделить 2D-массив.

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Поскольку коды разделителей блоков могут появляться в любом месте файла, вам необходимо прочитать и обработать весь файл. Предполагая, что программа не делает ничего абсурдного, стоимость задействованного ввода-вывода будет доминировать над общей стоимостью всей программы.

Я, конечно, могу повторить с l для 1013 * и посчитать эти значения, но я предполагаю, что это не лучший подход.

Почему это не лучший подход? Конечно, детали важны, но вы должны сравнить каждый 4-байтовый фрагмент, интерпретируемый как представление int32_t, со значением 999999999. Это по своей сути итеративный процесс, и его можно хорошо представить через for , while или do l oop. Я бы написал это примерно так:

#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++;
    }
}
0 голосов
/ 04 марта 2020

Могу ли я порекомендовать OpenMP для увеличения скорости. OpenMP - это действительно простой способ использования мультипроцессинга в ваших программах. Подход для l oop все тот же. Вы просто добавляете строку #pragma omp parallel for над вашей для l oop и компилируете с -fopenmp. Это скажет компилятору разделить итерацию на блоки и выполнить процесс параллельно на нескольких ядрах. Я предполагаю, что у вас есть что-то вроде ++count, когда значение соответствует желаемому. Вы также должны были бы объявить его как общий. Обратитесь к этой ссылке для получения дополнительной информации об этом и о том, как вы можете использовать OpenMP.

Но кроме этого, в C нет лучшего способа сделать это. Я думаю, что эта ссылка немного устарела, поэтому вы можете также рассмотреть SIMD и векторизацию. OpenMP также имеет простой способ добавить эту функциональность.

...