gpt4 book ai didi

c++ - 如何从文件中读取数据 block ,然后从该 block 读取到 vector 中?

转载 作者:太空狗 更新时间:2023-10-29 20:43:30 24 4
gpt4 key购买 nike

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

我之所以要这样做,首先是为了减少磁盘的I/O操作。根据我的了解,磁盘 i/o 操作要昂贵得多。或者它会花费与我从文件中逐条读取记录并直接将其放入 vector 而不是逐 block 读取所花费的时间相同的时间吗?在逐 block 读取时,我将只有 n 个磁盘 I/O,而如果我逐条读取记录,则有 x 个 I/O。

谢谢。

最佳答案

您应该考虑使用 mmap()而不是使用 read() 读取文件。

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

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

此外,mmap 可能会很麻烦,如果您要写入大量数据,并且事先不知道数据的大小。除此之外,在 read 上使用它总是更好更快。

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

关于c++ - 如何从文件中读取数据 block ,然后从该 block 读取到 vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15128383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com