C++ 在C++;,将大型二进制文件(1GB-4GB)加载到内存中的最快方法是什么?
在64位Linux(比如AmazonEC2实例)上,我需要将几个大的二进制文件加载到内存中。最快的方法是什么C++ 在C++;,将大型二进制文件(1GB-4GB)加载到内存中的最快方法是什么?,c++,linux,posix,C++,Linux,Posix,在64位Linux(比如AmazonEC2实例)上,我需要将几个大的二进制文件加载到内存中。最快的方法是什么 ifstream 弗瑞德 POSIX公开赛 POSIX mmap(实际上不会将整个文件加载到内存中,这会影响性能) 还有别的吗 此外,节点可能会也可能不会再次启动此可执行文件,因此如果在后续尝试中加载文件的速度更快,则会有所帮助。某些类型的预加载步骤甚至可能会起作用。时间将由磁盘I/O决定,因此使用哪种API不如考虑磁盘的工作方式重要。如果你随机访问一个磁盘(旋转介质),寻找它需要3
- ifstream
- 弗瑞德
- POSIX公开赛
- POSIX mmap(实际上不会将整个文件加载到内存中,这会影响性能)
- 还有别的吗
此外,节点可能会也可能不会再次启动此可执行文件,因此如果在后续尝试中加载文件的速度更快,则会有所帮助。某些类型的预加载步骤甚至可能会起作用。时间将由磁盘I/O决定,因此使用哪种API不如考虑磁盘的工作方式重要。如果你随机访问一个磁盘(旋转介质),寻找它需要3到9毫秒。。。一旦磁盘进行流式传输,它可以维持大约128 MB/秒的速度,这就是从磁头流出位的速度。SATA链路或PCIe总线的带宽远高于此(600到2000 MB/秒)。Linux在内存中有一个页面缓存,它在磁盘上保存页面的副本,因此,如果您的机器有足够的RAM,那么后续的尝试将非常快,即使您随后随机访问数据。因此,建议一次读一大块。如果您真的想加快初始加载速度,那么可以使用mmap映射整个文件(1GB-4GB),并使用一个助手线程按顺序读取每个页面的第一个字节 你可以阅读更多关于
您可以阅读更多关于的信息。鉴于上述信息,我认为
mmap
是一个很好的候选人。我有几个理由这样说:
1.在实际需要该部分之前,它将提供整个文件,而不实际加载(任何)文件。这是快速加载的一个优势,但如果您最终将遍历每个字节[或触及文件的每个4KB部分],则没有太大区别。
2.mmap
只会将数据从磁盘复制一次到页面。在我的测试中,这比在Linux中使用fread
或read
读取更有效请注意,<>代码> FRAD 和“每秒字节数”的一个好基准是使用
ddif=/dev/zero of=somefile bs=4K count=1M
(这样写一个文件,你可能需要dd if=somefile of=/dev/null bs=4K
,看看你能从磁盘读取多少。你可以尝试mmap
使用MAP\u POPULATE
标志。我怀疑你能不能更快地完成这项工作。你打算如何访问该文件?在使用之前,你需要将所有文件都存储在内存中吗它?你是要读和写,还是只是读?为什么不从前4个选项的基准开始呢?我认为你可以很容易地衡量这一点,而且你可能无论如何都需要这样做:当涉及到性能时,你不应该盲目地相信任何东西而不进行衡量。你确定使用mmap实际上会更慢吗?你的进程的内存会更大n可以与文件内容一样进行交换。此外,对于mmap,您可以尝试使用MAP_POPULATE标志来预故障映射的页面。我需要在内存中保存整个文件,然后才能使用它。加载文件后,我将有多个线程随机访问该文件。是的,使用带有MAP_POPULATE的mmap速度很快,并且有助于后续的执行唯一的技巧是确保二进制数据按缓存线大小的块进行组织。