C++ 如何从文件中读取数据块,然后将数据块读入向量?

C++ 如何从文件中读取数据块,然后将数据块读入向量?,c++,database,memory,memory-management,C++,Database,Memory,Memory Management,假设我有一个包含x条记录的文件。一个“块”保存m个记录。文件中的块总数n=x/m。如果我知道一条记录的大小,比如b字节(一个块的大小=b*m),我可以使用系统命令read()一次读取整个块(还有其他方法吗?)。现在,我如何从这个块中读取每条记录,并将每条记录作为单独的元素放入向量中 我之所以要这样做,首先是为了减少磁盘I/o操作。据我所知,磁盘i/o操作的成本要高得多。 或者,它会花费和我从文件中逐个记录地读取并直接将其放入向量而不是逐块读取时相同的时间吗?逐块读取时,我将只有n个磁盘I/O,而

假设我有一个包含x条记录的文件。一个“块”保存m个记录。文件中的块总数n=x/m。如果我知道一条记录的大小,比如b字节(一个块的大小=b*m),我可以使用系统命令read()一次读取整个块(还有其他方法吗?)。现在,我如何从这个块中读取每条记录,并将每条记录作为单独的元素放入向量中

我之所以要这样做,首先是为了减少磁盘I/o操作。据我所知,磁盘i/o操作的成本要高得多。 或者,它会花费和我从文件中逐个记录地读取并直接将其放入向量而不是逐块读取时相同的时间吗?逐块读取时,我将只有n个磁盘I/O,而如果逐个记录读取,则会有x个I/O


谢谢。

一次读取一个块并不一定会减少I/O操作的数量。标准库在从文件读取数据时已经进行了缓冲,因此(通常)您不希望每次尝试从流读取数据(或任何接近的数据)时都看到实际的磁盘输入操作

一次读取一个块仍有可能减少I/O操作的数量。如果您的块大于流默认使用的缓冲区,那么您希望看到用于读取数据的I/O操作更少。另一方面,您可以通过调整流所使用的缓冲区的大小来完成同样的任务(这可能要容易得多)。您应该考虑使用而不是使用<代码>读()/代码>读取文件。

mmap
的好处在于,您可以将文件内容简单地映射到流程空间,就好像您已经有了指向文件内容的指针一样。通过简单地检查内存内容并将其视为一个数组,或者通过使用
memcpy()
复制数据,您将隐式执行读取操作,但仅在必要时执行—操作系统虚拟内存子系统足够智能,可以非常高效地执行此操作

避免mmap的唯一可能的原因可能是,如果您运行的是32位操作系统,并且文件大小超过2G字节(或略小于2G字节)。在这种情况下,操作系统可能无法为
mmap
-ed内存分配地址空间。但是在64位操作系统上使用
mmap
应该永远不会是问题

另外,
mmap
如果您正在编写大量数据,并且数据的大小事先未知,则可能会很麻烦。除此之外,在
阅读时使用它总是更好更快


实际上,大多数现代操作系统广泛地依赖于
mmap
。例如,在Linux中,要执行某些二进制文件,您的可执行文件只需
mmap
-ed,并从内存中执行,就好像它是通过
read
复制到内存中的一样,而实际上没有
读取它。

您好,感谢您的回复。所以,要清楚的是,你是说,第一次我调用“GETLIN(FILIONEXECUTHER,STR)”时,C++已经隐含地将包含这条线的块从HDD带到内存中?因此,当我第二次读取一行时,不会进行磁盘I/O操作,而是从主内存中读取该行(假设两行位于同一块中)?此外,块大小可以高达2-3 mb。缓冲区大小是否也一样大?我们如何增加缓冲区大小?@NikharAgrawal:是的,当你调用getline时,它可能会从磁盘中读取8K的数据,然后向你发送(比如)组成该行的60个字节。是的,在8K用完之前,它不会从磁盘发出另一次读取。但也是的,它的大小可能是4-16KB,而不是2-3MB。谢谢。)关于如何在C++中增加缓冲区大小的想法?@ NIKHARAGRAWAL:OOOP,对不起。code>yourstream.rdbuf()->pubstebuf(buffer,sizeof(buffer))