Я пишу программу, которая записывает массивы и информацию о них в двоичный файл.
Мой первый подход состоял в том, чтобы вызывать fwrite 4 раза: один раз для общей информации о массиве, один раз для отметки времени, один раз для измерения массива и один раз для записи самого массива.Этот подход работал довольно просто, но время выполнения было слишком медленным, поскольку программа многопоточная и часто выполняет запись на диск SAS, заполняя диск запросами, которые представляли узкое место.
Новыйподход заключался в создании массива структур, содержащих необходимую информацию, моя структура была бы следующей:
struct array_data{
int information;
int timestamp;
int size;
int* data_array;
}
Во время выполнения я записывал данные в буфер и, когда у меня было все, что мне нужно, он вызывал быmalloc для выделения array_data.data_array
и копирования всего из буфера из цикла for.
Проблема в том, что когда я вызываю fwrite для записи всей структуры, первые 3 члена структуры записываются правильно, амассива нет, и это связано с тем, что адрес массива не является смежным, так как он указывает на другое место в памяти после malloc.
Лучшее решение этого было бы объявить data_array как статический массивТаким образом, fwrite будет работать так, как мне нужно, но тогда у меня будетвызывать fwrite для каждой структуры, вместо того, чтобы вызывать ее один раз для записи массива структур, что могло бы повлиять на производительность, сводя на нет использование структуры.
Я также пытался использовать массив динамически размещаемых структуробъявив мою структуру следующим образом:
struct array_data{
int information;
int timestamp;
int size;
int data_array[];
}
и выделив массив структур с помощью malloc, но адрес struct_array[1].information
не тот сразу после struct_array[0].data_array[last_index]
, кажется, есть еще 5между байтами, так что если бы я вызвал fwrite с struct_array, данные в файле все равно были бы неверными.
Есть ли способ использовать структуры для решения этой проблемы, или я должен просто придерживаться записи своих массивов вфайл как я делал в первую очередь?