【发布时间】:2021-10-20 09:57:59
【问题描述】:
我有一个循环将处理后的数据写入文件。数据包含在一个链表中,并在一个迭代链表的 while 循环中写出。
我的问题是,我应该在 while 循环之前/之后打开/关闭写出文件,如下所示,还是应该在循环内移动打开/关闭,以便每次迭代打开然后关闭文件而不是保留在整个循环期间打开文件?
链表有数百 MB 的数据,可能有几个 GB。每次迭代都会写出不超过 80 个字符的行。这是在现代 linux 系统上运行的。
编辑:这不是嵌入式/关键系统。万一在关闭文件之前进程被中断,它将重新启动。
void msgs_output_to_file(Node *head) {
Node *l = head;
MsgType msg_type;
char line[MAX_LINE_SIZE];
FILE *file1 = NULL;
FILE *file2 = NULL;
file1 = fopen("file1.csv", "w");
file2 = fopen("file2.csv", "w");
while (l && l->data) {
memset(line, 0, (size_t) MAX_LINE_SIZE);
sprintf_msg(line, l->data);
line[strlen(line)] = '\n'; // add new line
msg_type = get_msg_type(l->data);
switch (msg_type) {
case TYPE_1:
fputs(line, file1);
break;
case TYPE_2:
fputs(line, file2);
break;
default:
break;
}
l = l->next;
}
fclose(file1);
fclose(file2);
}
【问题讨论】:
-
打开文件的开销很大,因此在循环期间保持文件打开会更有效。
-
我删除了 c++ 标签,因为在 c++ 中,解决方案看起来会大不相同。请仅标记您实际使用的语言
-
第三种选择是每 N 行写入一个缓冲区。