У меня есть огромный файл для чтения. У меня есть поток ввода-вывода, который считывает данные (4 МБ) с диска и сохраняет в виде кругового массива из 6 элементов (4 МБ каждый). У меня есть другой поток, который читает из кольцевого буфера, чтобы преобразовать данные в некоторые записи.
Проблема в том, что у меня могут быть записи, которые охватывают 2 разных буфера (то есть, скажем, запись может начинаться с конца 1-го буфера и продолжаться до начала следующего буфера)
Как мне справиться с такими случаями?
Не могли бы вы указать пример реализации?
Ваша функция для чтения из буфера должна читать из следующего буфера, когда запись охватывает два буфера.
Точнее, создайте функцию, которая собирает запись из данных в буфере. Если указатель данных достигает конца буфера до завершения записи, установите указатель данных на начало следующего буфера.
Хм, похоже, это можно применить более обобщенно. Создание элементов путем чтения из указателя данных. Прежде чем получить доступ к указателю данных, проверьте конец буфера. Если указатель находится за концом буфера, установите его в начале следующего буфера. Эта концепция очень похожа на буферизованный ввод / вывод. Хм, возможно, вы можете изменить iostream или создать свой собственный, который будет извлекать данные из ваших буферов вместо cin или файла. смотреть на std::istringstream
,
Вы должны разделить процесс чтения записи на этапы:
Вы можете использовать стандартные классы, чтобы выполнить первый шаг, как сказал Томас, или реализовать собственное решение. Тривиальное решение может выглядеть так (при условии фиксированного размера записей)
class BufferReader{
...
public :
// this function will read data from buffers.
// size of readed data is arbitrary and does not depend on buffer size
// it will return -1 when eof reached, readed size in other case
int readData(char *data, int length);
...
}
Затем вы можете проанализировать ваши записи:
int size = /* size of the record */;
BufferReader br(/* some construction parameters here */)
char data[size];
while(br.readData(data, size) == size){
// parse your data to fill your record
...