我有一个巨大的文件要阅读。我有一个 IO 线程,它从磁盘读取数据(4mb)并存储在 6 个元素(每个 4mb)的循环数组中。我有另一个线程从循环缓冲区中读取数据以将数据转换为一些记录。
问题是我可以拥有跨越 2 个不同缓冲区的记录(即,说记录可以从第一个缓冲区的末尾开始并延伸到下一个缓冲区的开头)
我该如何处理这种情况?
你能指出一些示例实现吗?
我有一个巨大的文件要阅读。我有一个 IO 线程,它从磁盘读取数据(4mb)并存储在 6 个元素(每个 4mb)的循环数组中。我有另一个线程从循环缓冲区中读取数据以将数据转换为一些记录。
问题是我可以拥有跨越 2 个不同缓冲区的记录(即,说记录可以从第一个缓冲区的末尾开始并延伸到下一个缓冲区的开头)
我该如何处理这种情况?
你能指出一些示例实现吗?
当一条记录跨越两个缓冲区时,从缓冲区读取的函数应该从下一个缓冲区读取。
更准确地说,创建一个从缓冲区中的数据组装记录的函数。如果数据指针在记录完成之前到达缓冲区的末尾,则将数据指针设置为下一个缓冲区的开头。
嗯,看起来这可以更通用地应用。通过读取数据指针来构建项目。在访问数据指针之前,检查缓冲区的结尾。如果指针超过缓冲区的末尾,则将其设置为下一个缓冲区的开头。这个概念与缓冲 I/O 非常相似。嗯,也许您可以修改 iostreams 或创建自己的,这将从您的缓冲区而不是 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
...