簡體   English   中英

寫入並在C中關閉文件后讀取文件

[英]Read a file after write and closing it in C

我的代碼執行以下操作

  1. 做100倍
    打開一個新文件; 寫入10M數據; 關閉它
  2. 一起打開100個文件,讀取並將它們的數據合並到一個更大的文件中
  3. 循環執行步驟1和2多次

我想知道我是否可以保持100個打開/關閉次數不太多。 我能做的是用w+ fopen它們。 寫入后,我將位置設置為開始讀取,讀取后,我將位置設置為開始寫入,依此類推。

問題是:

  1. 如果我在關閉后不進行寫入,我們是否總是讀取所有寫入的數據
  2. 這會節省一些開銷嗎? 文件打開和關閉必須有一些開銷,但是此開銷是否足以保存?

在評論和討論的基礎上,我將討論為什么我需要在工作中這樣做。 這也和我的其他帖子有關

如何有效地將大型的基於行的表轉換為基於列的表

我有一個生成結果流的計算。 到目前為止,結果已保存在行存儲表中。 該表有1M列,每列可能有10M長。 實際上,每一列都是計算產生的一個屬性。 在計算運行時,我轉儲並將中間結果附加到表中。 中間結果可能是每列2或3個double值。 我想盡快轉儲它,因為它已經消耗了> 16M的內存。 並且計算需要更多的備忘錄。 最終得到如下表

 aabbcc...zzaabbcc..zz.........aabb...zz

一行數據存儲在一起。 當我要逐列分析數據時,就會發生問題。 因此,我必須讀取16個字節,然后搜索下一行以讀取16個字節,然后繼續進行。 搜索次數太多,比所有列都存儲在一起要慢得多,因此我可以順序讀取它們。

我可以減少計算轉儲的頻率。 但是為了使后期閱讀更加有效。 我可能希望將4K數據存儲在一起,因為我假設即使我只讀取16個字節,每個讀取默認情況下也都是4K。 但這意味着我需要在內存中緩沖1M * 4k = 4G ...

所以我在想是否可以將片段數據合並成更大的塊

如何有效地將大型的基於行的表轉換為基於列的表

因此,我想使用文件作為脫機緩沖區。 如果每個文件包含1M的2個double,則合並后可能需要256個文件來獲取4K連續數據。 就主要計算而言,這項工作可以異步方式完成。 但是我想確保合並開銷很小,因此當它並行運行時,可以在完成主計算之前完成。 所以我想到了這個問題。

我想這與如何構造基於列的數據庫非常相關。 人們創建它們時,是否會遇到類似的問題? 關於創作如何運作有任何描述嗎?

只要系統上打開文件的最大數量允許,您就可以使用w+ 通常為255或1024,可以設置(例如,在Unix上通過ulimit )。

但是我不太確定這樣做是否值得。

另一方面,每個10M的100個文件為1 GB。 您可能要嘗試使用RAM磁盤。 或帶有大文件系統緩存。

我懷疑通過分析您的特定問題結構,可能會節省大量資金。 為什么是100個文件? 為什么是10 M? 您正在執行哪種“合並”? 是否總是以相同的順序和相同的頻率訪問那100個文件? 能否將某些數據保留在RAM中,而根本不寫入?

更新資料

因此,您有幾個大型緩沖區,例如

ABCDEFG...
ABCDEFG...
ABCDEFG...

而您想繞開它們,以便他們閱讀

AAA...
BBB...
CCC...

如果已經有了總大小(即,您知道將要寫入10 GB的數據),則可以使用兩個文件來完成此操作,預先分配文件並使用fseek()寫入輸出文件。 對於內存映射文件,這應該非常有效。 實際上,行Y的X列1,000,000已被轉儲到文件Y.dat地址16 * X Y.dat 您需要將其寫入地址16 *(Y * 1,000,000 + X)到largeoutput.dat

實際上,即使在第一次計算期間,您也可以寫入數據。 或者,您可以讓兩個進程通過管道進行通信,一個進行計算,一個同時寫入行列和列行文件,以便您可以監視每個進程的性能。

坦白說,我認為增加更多的RAM和/或快速的I / O層(也許是SSD?)可以使您在相同的價格下獲得更大的成功。 您的時間也會花費很多,並且這項工作完成后,內存將仍然可用。

是。 您可以保持100個文件處於打開狀態,而無需執行打開-關閉-打開循環。 但是,大多數系統確實對打開文件的數量有限制。

如果我在關閉后不進行寫入,我們是否總是讀取所有寫入的數據

這取決於你。 您可以在文件中的任何位置進行fseek跳轉,然后從那里讀取數據。 這就是您和您的邏輯的全部方式。

這會節省一些開銷嗎? 文件打開和關閉必須有一些開銷,但是此開銷是否足以保存?

這肯定會節省一些開銷,例如額外的不必要的I / O操作,並且在某些系統中,您寫入文件的內容不會立即刷新到物理文件,它可能會定期緩沖和刷新,或者在關閉時完成。

因此,可以節省此類開銷,但真正的問題是,通過節省此類開銷可以實現什么? 它如何適合您的應用程序整體情況? 這是確定邏輯之前必須進行的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM