【发布时间】:2016-11-21 16:17:27
【问题描述】:
我正在为运行 Linux 的嵌入式系统开发一个应用程序。
就我而言,我有一个相当大的文件(与系统的能力相比)作为输入。该文件有一个小标题,其大小仅为几百字节。在我的应用程序中,我需要从文件中删除该标头,以便该文件没有标头并且仅包含相关数据。通常,我会实现如下(伪代码):
char *input_file = "big_input.bin";
char *tmp_file1 = "header.bin";
char *tmp_file2 = "data.bin";
/* Copy the content of header from input file to tmp_file1 */
_copy_header(tmp_file1, input_file);
/* Copy the data from input file to tmp_file2 */
_copy_data(tmp_file2, input_file);
/* Rename temp file to input file */
unlink(input_file);
rename(tmp_file2, input_file);
这种方法的问题在于它创建了一个临时文件tmp_file2,其大小几乎与输入文件一样大(因为标题非常小)。在我的系统中,所有内容都存储在 RAM 上,这是非常有限的。创建大的临时文件会导致内存不足错误。
那么我怎样才能避免创建一个大的临时文件呢?
【问题讨论】:
-
移动而不是复制。
-
映射它。记住它。截断它。如果没有足够的内存来映射整个文件,请分段进行。