我有一个巨大的文件要读。我有一个IO线程,它从磁盘读取数据(4mb)并存储在一个由6个元素(每个4mb)组成的循环数组中。我有另一个从循环缓冲区读取的线程,将数据转换成一些记录。
问题是我可以有跨越2个不同缓冲区的记录(即,说记录可以从第一个缓冲区的末尾开始,并延伸到下一个缓冲区的开始)
我该如何处理此类案件?
你能指出一些示例实现吗?
答案 0 :(得分:0)
当记录跨越两个缓冲区时,从缓冲区读取的函数应从下一个缓冲区读取。
更确切地说,创建一个从缓冲区中的数据组装记录的函数。如果数据指针在记录完成之前到达缓冲区的末尾,则将数据指针设置为下一个缓冲区的开头。
嗯,看起来这可以更普遍地应用。通过读取数据指针来构建项目。在访问数据指针之前,检查缓冲区的结束。如果指针超过缓冲区的末尾,则将其设置为下一个缓冲区的开头。这个概念与缓冲I / O非常相似。嗯,也许你可以修改iostream或创建自己的iostream,它将从你的缓冲区而不是cin或文件中获取数据。看看std::istringstream
。
答案 1 :(得分:0)
您应该将记录阅读过程分为以下步骤:
您可以使用标准类来实现第一步,因为Thomas说或实施了您自己的解决方案。一个简单的解决方案可能看起来像这样(假设记录的大小固定)
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
...