我有一个大约400MB的二进制文件,我想将其转换为CSV格式。输出CSV文件大约为1GB(根据我的计算)。
我读取二进制文件并将其存储在结构数组中(也需要进行其他处理),当用户想将其导出为CSV时,我正在创建一个文件(或打开现有文件 - 取决于用户的选择),使用fopen
打开它,然后逐行使用fwrite
写入它。
来自我的问题,来自CPlusPlus.com的这个link说:
如果不知道返回的流,则默认情况下完全缓冲 参考交互设备
我的查询是当我打开这个文件时,它会被加载到RAM中吗?就像最后一样,我的文件大约是1GB,它会消耗那么多内存还是只是在硬盘上?
此代码将在Windows和Android上运行。
答案 0 :(得分:2)
FILE*
个流缓冲是一个C功能,它用于减少系统调用开销(即不要为每个read()
调用fgetc()
,这是昂贵的)。通常缓冲区很小 - 即512字节。
页面缓存或类似的机制是不同的动物 - 它们用于减少磁盘操作的数量。通常操作系统使用 free 内存来缓存先前读取或写入的数据到磁盘,以便后续操作使用RAM。
如果可用内存不足 - 数据将从页面缓存中逐出。
答案 1 :(得分:1)
operating system和file system以及特定于计算机。这可能并不重要。阅读page cache。
BTW,您可能对sqlite
感兴趣从应用程序编写者的角度来看,您应该更关心virtual memory的address space和process而不是RAM。物理RAM由操作系统管理。
在Linux和Android上,如果您想进行优化,可以考虑(稍后)使用posix_fadvise(2)和madvise(2)。我不确定你的情况是否值得痛苦(因为今天的千兆字节文件不是那么多)。
答案 2 :(得分:0)
我读取二进制文件并将其存储在一个结构数组中(也需要进行其他处理),以及当用户想将其导出为CSV时
阅读本身并没有使用大量内存,就像myaut说缓冲区很小。这里房间里的大象是:你读完所有文件并将所有数据放入结构中吗?或者您是在一次或几次读取后开始处理以获得所需的最少量数据来进行某些处理?做前者确实会使用~400MB或更多的内存,后者会使用相当少的内容,可以说,这一切都取决于需要的数据量来开始处理,也许你需要所有数据一次加载。