我有一個回圈將處理后的資料寫入檔案。資料包含在鏈接串列中,并在迭代串列的 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);
}
uj5u.com熱心網友回復:
一般規則是您應該只打開檔案一次(因此在回圈之外)并在整個回圈期間保持打開狀態。理由是打開檔案是一項相當昂貴的操作。
但是(對于任何一般規則)也有例外......重要的是你的程式在回圈中間發生了崩潰。如果后果只是您必須重新開始作業,并且概率很低,請繼續前進。如果您正在處理任務關鍵資料,如果結果檔案最終被破壞,并且如果(無論原因如何)崩潰,那么這些資料將丟失,那么情況就會有所不同。您必須在性能(只有一個打開/關閉)和健壯性之間取得平衡。至少您應該每 n 行重繪 一次檔案(n 是您可以接受的最大行數)以最大程度地減少可能的資料丟失。
uj5u.com熱心網友回復:
我對打開檔案(在 Python 中)的理解是,您不會將整個檔案加載到記憶體中,而是接收檔案句柄。使用此檔案句柄,您的腳本可以訪問“高級”操作,例如讀取和寫入一行。向檔案寫入一行時,檔案內容不會直接寫入硬碟。相反,內容被放置在緩沖區中,當作業系統想要這樣做時,或者當您使用 fclose() 關閉檔案時,內容實際上是由作業系統寫入檔案的。
這種緩沖系統的優點是,當你在回圈中寫入檔案時,對硬碟的寫入操作量是有限的,因為內容不是直接寫入磁盤而是寫入緩沖區。當緩沖區中有足夠的內容或關閉檔案時,緩沖區內容就會寫入磁盤。如果每次迭代都打開和關閉檔案,則會增加對磁盤的寫入運算元并增加開銷。
所以簡短的回答是,我會在回圈之前打開檔案并在回圈之后關閉檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327468.html
