打开文件时占用的内存
RAM consumption on opening a file
我有一个~400MB的二进制文件,我想将其转换为CSV格式。输出的CSV文件将为~1GB(根据我的计算)。
我读取二进制文件并将其存储在结构数组中(其他处理也需要),当用户想要将其导出为 CSV 时,我正在创建一个文件(或打开现有文件 - 取决于用户的选择),使用 fopen
打开它,然后使用 fwrite
写入它, 一行一行。来到我的问题,CPlusPlus.com 的这个链接说:
默认情况下,返回的流是完全缓冲的,如果已知它不是 引用交互式设备
我的查询是当我打开这个文件时,它会加载到 RAM 中吗?就像最后,我的文件是~1GB,它会消耗那么多RAM还是只在硬盘上?
此代码将在Windows和Android上运行。
FILE*
流 缓冲是C功能,它用于减少系统调用开销(即不要为每个fgetc()
调用read()
,这很昂贵)。通常缓冲区很小 - 即 512 字节。
页面缓存或类似的机制是不同的野兽 - 它们用于减少磁盘操作的数量。通常操作系统使用可用内存将以前读取或写入的数据缓存到磁盘/从磁盘缓存,因此后续操作将使用 RAM。
如果可用内存不足 - 数据将从页面缓存中逐出。
它是特定于操作系统和文件系统以及计算机的。这可能并不重要。阅读有关页面缓存的信息。
顺便说一句,您可能对sqlite感兴趣
从应用程序编写器的角度来看,您应该更关心进程的虚拟内存和地址空间,而不是 RAM。物理 RAM 由操作系统管理。
在 Linux 和 Android 上,如果你想优化它,你可以考虑(稍后)使用 posix_fadvise(2) 和 madvise(2)。我不确定在您的情况下是否值得痛苦(因为今天千兆字节的文件并不多)。
我读取二进制文件并将其存储在结构数组中(其他处理也需要),当用户想要将其导出为 CSV 时
读取本身不会占用大量内存,就像 myaut 所说的缓冲区很小一样。房间里的大象是:你是否阅读了所有文件并将所有数据放入结构中?还是在一次或多次读取后开始处理,以获得执行某些处理所需的最小数据量?做前者确实会使用~400MB或更多的内存,做后者会用得少很多,话虽如此,这完全取决于开始处理所需的数据量,也许你需要一次加载所有数据。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- WinVerifyTrust 仅在使用文件而不是内存 blob 时才有效
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 内存映射文件访问非常慢
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- 这些结构在文件中的大小不同,但在程序内存中的大小相同
- 在嵌入式系统中读取文件的内存碎片
- 如何从文件中读取 100x24 矩阵并将其作为浮点矩阵保存在内存中?
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 提升进程间共享内存删除、权限和输出文件
- 将内存文件添加到 clang 编译器实例
- 为什么我的 C++ 程序在执行 TCMALLOC 堆检查器或堆配置文件时使用大量内存
- C++ 从磁盘读取文件并将其写入共享内存
- 为什么在编译时需要知道对象的内存配置文件以进行堆栈放置?
- 增强共享内存:文件的卷已被外部更改,打开文件不再有效
- 在内存文件中使用
- 创建内存文件
- 将char指针映射到具有文件描述符的内存文件