2014-09-21 27 views
3

我想寫這樣的一個文件:如何在C#中以非常快的速度將雙精度數組寫入文件?

FileStream output = new FileStream("test.bin", FileMode.Create, FileAccess.ReadWrite); 
BinaryWriter binWtr = new BinaryWriter(output); 
double [] a = new double [1000000]; //this array fill complete 

for(int i = 0; i < 1000000; i++) 
{ 
    binWtr.Write(a[i]); 
} 

不幸的是這個代碼的過程持續很長時間! (在這個例子中大約10秒!)

文件格式是二進制的。

我該如何做得更快?

+1

顯示一個以上位的代碼,你如何處理文件。 – SimpleVar 2014-09-21 17:46:10

+1

@YoryeNathan他打開它,並通過二進制作家寫入它。 – AgentFire 2014-09-21 17:47:22

+2

對不起我編輯最後很長!但我寫的更多。這夠了嗎? – MHSFisher 2014-09-21 17:52:14

回答

8

您應該能夠通過你的雙打數組轉換爲加快進程一個字節數組,然後一次寫入字節。

This answer示出了如何執行轉換(下面的代碼來自該答覆):

static byte[] GetBytes(double[] values) { 
    var result = new byte[values.Length * sizeof(double)]; 
    Buffer.BlockCopy(values, 0, result, 0, result.Length); 
    return result; 
} 

在手字節數組,you can call Write that takes an array of bytes

var byteBuf = GetBytes(a); 
binWtr.Write(byteBuf); 
+2

或你可以去'不安全',並且安全一個寶貴的幾個週期:D – leppie 2014-09-21 18:08:53

+0

雖然技術上正確,但它可能有助於解釋爲什麼它更快。因爲如果OP需要寫入4GB的字節,這肯定不會起作用。 – Aron 2014-09-21 23:42:31

+0

@leppie我希望任何人都可以提供分析結果,顯示它足以證明在項目中啓用不安全代碼的合理性 - 因爲我敢打賭它不會做太多,而不是在這種情況下:) – 2014-09-21 23:54:06

-1

你正在寫1字節的1,當然它會很慢。

你可以做的書面內存數組,然後寫入陣列磁盤一次全部是這樣的:

var arr = new double[1000000]; 
using(var strm = new MemoryStream()) 
using (var bw = new BinaryWriter(strm)) 
{ 
    foreach(var d in arr) 
    { 
     bw.Write(d); 
    } 
    bw.Flush(); 
    File.WriteAllBytes("myfile.bytes",strm.ToArray()); 
} 
+1

你不能這樣做,因爲'a'是一個雙精度數組,而不是字節。 – itsme86 2014-09-21 17:58:01

+0

好點的missread和重新鍵入是,將解決它 – 2014-09-21 18:37:30

+0

@ itsme86修復它 – 2014-09-21 18:41:52

相關問題