打开文件时占用的内存

RAM consumption on opening a file

本文关键字:内存 文件      更新时间:2023-10-16

我有一个~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或更多的内存,做后者会用得少很多,话虽如此,这完全取决于开始处理所需的数据量,也许你需要一次加载所有数据。