超大資料量,如何加快寫檔案的速度?

時間 2021-06-03 02:57:35

1樓:牙雅

源資料是什麼格式?可否用load方式匯入資料庫,編寫程式分批次並行運算元據庫,生成符合要求的檔案。大型機處理億級別的資料,應該1個小時足夠了。

2樓:

不是十分清楚題主遇到的是什麼樣的問題,是已經有了硬碟裡的資料要讀進來處理一下再寫回硬碟嗎?如果是這樣的話原始資料是什麼格式的呢?寫回去的時候有什麼格式要求嗎?

過程中要做什麼樣的處理?

最近正好在做乙個資料處理的問題,如果題主的問題和我的類似的話可能會有點幫助。

我的情況是這樣的:

原始資料是幾百個幾十到幾百兆不等的binary檔案,總大小大概在25G左右。所有資料都是雙精度浮點數。也就是說一共有大概3billion個資料。

由於資料格式已知,我用的是 numpy.fromfile,速度還是相當快的,起碼資料讀取不是我的問題的瓶頸。

處理過程比較特殊,可能沒啥參考價值,但是我benchmark的結果是大概處理(read, process, write back)一千萬個資料需要的時間是三秒鐘左右。所以大概二十分鐘處理完30億個資料。

當然以上所說的前提都是檔案讀寫採用binary格式。如果是ASCII格式我就不知怎麼玩這麼大的資料了。

3樓:

我試了下寫1,000,000行,每行兩個數字,總共0.3s,也就是每條只有0.0003ms,寫入速度大概是50MB/s。你的0.5ms是隨便說的還是試出來的?

C的FILE結構體裡面是有buffer的,我的預設是4096 byte,你也可以通過setbuffer函式自己設定buffer的大小,但是我的結果是更大的buffer已經不能再提高寫入速度了,預設的buffer大小已經足夠了。

題主可以試試用確定的一組數值做計算,看下計算的時間,把讀取資料,計算資料,輸出結果的時間分開看下,1億組輸出結果的時間大概就是30min。

時間可能大部分都花在計算上了,而不是IO。

--至於把資料全放記憶體裡寫入,這個是沒用的

--補充:

以上結果用的是fprintf,這個函式本身的呼叫處理過程會花費很多時間,剛才想到fwrite,試了下,速度大概是260MB/s(fread的速度是330MB/s),我的硬碟是ssd,估計這個速度差不多是極限了

4樓:紀路

用不著,這裡題主犯的錯誤是一條一條的寫,正確的做法,是將資料用'\n',也就是換行符拼接在一起當做一行寫入。因為只要有換行符,資料就是分行的,不必一行一行的寫入。如果記憶體裝不下的話,就1千萬行拼一起,寫一次,一共寫17次。

寫入效能會提高1000-10000倍。

MongoDB 如何應對大資料量查詢做優化,並做結果過濾處理?

johnson 還是得具體問題具體分析,有很多因素要考慮 1.資料集大小 決定了需要處理多少資料,理想狀態是能全部載入到記憶體中處理 2.結果集大小 決定了要返回多少資料。比如聚合排序時記憶體使用超過100m就要開啟allowDiskUse開關,並且效能下降很大。3.查詢邏輯的複雜度 決定了是可以用...

php百萬級大資料量匯出資料到excel,如何成功並高效匯出?

為何人類還是放棄不了excel來辦公?是不是側面說麵了目前市面上的大部分系統平台都還需要努力?大資料分析時代,程式設計師所做的系統為什麼會導致使用者寧願大費周折從系統中匯出excel,也不願意直接在系統中對資料進行操作分析?這是開發者和產品們很需要去思考的空間我認為乙個合格的系統平台應該能讓人們使用...

C 大資料量如何高效率讀取解析資料庫大字段?

蘇佳 幾十萬條不等於資料量很大。讀取10w資料表結構不是很複雜的情況下,網路好的情況下。幾秒就好了。然後用bulkinsert大概幾秒 一筆拆成多筆也差不多幾十秒也完成了 Table Valued Parameters Table Valued Parameters Database Engine ...