gpt4 book ai didi

c++ - 将大文件从 RAM 写入磁盘

转载 作者:太空宇宙 更新时间:2023-11-04 16:25:52 27 4
gpt4 key购买 nike

如果我需要将一个大文件从分配的内存写入磁盘,最有效的方法是什么?

目前我使用的是:

char* data = static_cast<char*>(operator new(0xF00000000)); // 60 GB 

// Do something to fill `data` with data

std::ofstream("output.raw", std::ios::binary).
write(data, 0xF00000000);

但我不确定最直接的方法是否也是最有效的,考虑到各种缓冲机制等。

我正在使用 Windows 7 64 位和具有 64 位目标的 Visual Studio 2012 RC 编译器。

最佳答案

对于 Windows,您应该使用 CreateFile API .仔细阅读该页面以及其中提到优化的任何链接。您传入一些标志以关闭缓冲。过去,当我以每秒约 800MB 的速度收集视频时,我就这样做过,并且必须尽快将其中的一小部分注销到 RAID 阵列。

现在,对于标志 - 我认为主要是这些:

  • FILE_FLAG_NO_BUFFERING
  • FILE_FLAG_WRITE_THROUGH

对于阅读,您可能需要使用 FILE_FLAG_SEQUENTIAL_SCAN,但我认为如果关闭缓冲,这将没有任何效果。

看看 Caching Behaviour section

您需要做几件事。首先,您应该始终写入扇区大小的倍数的数据量。这几乎是(或至少曾经是)512 字节,但您将来可能需要考虑最多 2048 字节。

其次,您的内存也必须与该扇区大小对齐。您可以使用 _aligned_malloc() 或只分配比您需要更多的缓冲区并手动对齐。

可能还有其他内存优化问题,您可能希望将单个写入操作限制为内存页面大小。我从来没有深入到那个深度。我仍然能够以非常接近磁盘极限的速度写入数据。它比使用 stdio 调用快得多。

如果你需要在后台执行此操作,你可以使用重叠 I/O,但老实说我一直不明白。我制作了一个后台工作线程,专门用于写出视频缓冲区并在外部对其进行控制。

关于c++ - 将大文件从 RAM 写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045939/

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