2011-11-19 99 views
0

我有兩種類型的文件。其中之一是ASCII文件,數據存儲如下;ASCII文件解析速度

X Y Value 
0 0 5154,4 
1 0 5545455; 
. . ... 
. . ... 

另外一個是二進制文件。

我用StreamReaderReadLine()方法解析第一個方法,然後通過Split(' ')將值設置爲double[,]數組。

我分析第二個與BinaryReader

解析二進制文件比ASCII文件快3-4倍。

問題1:讀取ASCII文件比二進制文件慢。這是正常的嗎?

問題2:你是否建議解析ASCII文件的另一種方法?

+0

讀取文本並解析它以將數據轉換爲二進制文件比直接讀取二進制文件要慢。慢3-4倍是不成問題的,尤其是如果文件被緩存(從而大大減少I/O時間)。向我們展示您用於解析的代碼。 –

+0

在任何一種情況下,您都應該在解析之前將整個流讀入內存。 –

+1

@DavidLively - 爲什麼?然後他會測量完全不同的東西;並且對於大文件(對於這種數據不是不合理的),它可能甚至不實用。 – Zarat

回答

3

這不是很多閱讀ascii是慢,但你如何做到這一點。

它的解析,尋找新的生產線,分隔符,則文本的轉換位爲其他格式。 BinaryReader基本上是一個直接的內存拷貝。

這就像固定長度和CSV或CSV和XML您添加的更多的元數據之間的差異,更可以擺脫它,但更多的IT成本。

讀通過字符的ASCII文件的字符可能制定出比的readline和分裂快,你可以優化它針對特定的文件結構。很多工作雖然非常脆弱,使其成爲一個可疑的前景。加載到單獨的線程可能甚至是並行處理線路,可能會更有收穫,肯定會更令人滿意並且可重用。

+0

起初,我通過char讀取並解析了ascii文件char,但這種方式速度較慢。我想因爲很多不規則的「空間」字符數。 –

+0

這裏有方法和手段,但最終你的優化會取消彼此,並且非常複雜的代碼可以完成一項簡單的任務。如果你需要這樣做,所有它真正說的是ascii是一個糟糕的選擇。 –

3

從ASCII文件和二進制閱讀沒有什麼不同,不同的是解析他們的,讀你解析字符串倍增ASCII文件後,這是二進制文件了過程時間。但你讀出的數據流是完全等於相當於二進制雙數量並且不需要解析。

0

每月一次,我們收到有350萬行的350 MB的csv文件,然後我們看它一次一行,並提出一些指標,它aprox的了。每次服務重新啓動時60秒。
我製作了一個程序,將它燒成170萬行,並將其轉換爲二進制格式,以達到24 MB。
這些數據在7 ms內直接讀入內存,索引在需要時生成,數據在使用時轉換。
內存消耗從400 MB降至90 MB。
問題的關鍵在於如果性能問題您應該選擇適當的數據格式,同時請注意,此解決方案是唯一可能的,因爲數據相當靜態,並且數據在24小時內檢索不到數百萬次。
我相信現在的新服務實際上回復得比以前快了一點。