Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,将大型二进制文件(1GB-4GB)加载到内存中的最快方法是什么?_C++_Linux_Posix - Fatal编程技术网

C++ 在C++;,将大型二进制文件(1GB-4GB)加载到内存中的最快方法是什么?

C++ 在C++;,将大型二进制文件(1GB-4GB)加载到内存中的最快方法是什么?,c++,linux,posix,C++,Linux,Posix,在64位Linux(比如AmazonEC2实例)上,我需要将几个大的二进制文件加载到内存中。最快的方法是什么 ifstream 弗瑞德 POSIX公开赛 POSIX mmap(实际上不会将整个文件加载到内存中,这会影响性能) 还有别的吗 此外,节点可能会也可能不会再次启动此可执行文件,因此如果在后续尝试中加载文件的速度更快,则会有所帮助。某些类型的预加载步骤甚至可能会起作用。时间将由磁盘I/O决定,因此使用哪种API不如考虑磁盘的工作方式重要。如果你随机访问一个磁盘(旋转介质),寻找它需要3

在64位Linux(比如AmazonEC2实例)上,我需要将几个大的二进制文件加载到内存中。最快的方法是什么

  • 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 和 Read < /C> >可以忽略合理的大读取。在C++代码流中<代码>文件> /Cuff>函数中很少有额外的开销来增加一个公平的开销,但是,在我的经验中,我已经尝试过多次这种形式。 像往常一样,基准测试总是胜过互联网上的询问。因此,你可能会发现我上面所说的在你的情况下是不正确的。正如所指出的,一旦代码足够好,代码中的任何开销都会与磁盘传输数据的速度相形见绌——即使你有一个非常奇特的具有大量并行(SSD)的RAID系统磁盘等,最终磁盘传输速度将达到瓶颈所在。此时,您所能做的就是尽量减少其他开销,并在磁盘交付数据后尽快将数据传输到应用程序


“每秒字节数”的一个好基准是使用
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速度很快,并且有助于后续的执行唯一的技巧是确保二进制数据按缓存线大小的块进行组织。