2012-10-09 55 views
0

我正在創建一個臨時文件來存儲無法放入內存的巨大矩陣。我想先將臨時文件寫入磁盤,以便我可以通過流對象尋找文件中的某個位置。我已經知道我需要的確切尺寸。VB.NET用字節填充大文件

寫2千兆字節的零的最簡單方法是什麼?

我試圖一次寫入一個字節,這真的很慢。我也嘗試編寫字節數組chunck,而且速度要快得多,但是我必須吮吸數學因素,因爲我無法獲得最終的大小。

+0

另請注意,您可能會獲得O/S支持來初始創建大文件。參見'fsutil文件createnew'。 –

回答

3

BinaryWriter有一個方法Seek,它允許你設置一個文件的任意位置,如果這個位置超出了文件的末尾。
如果您在此位置寫入一個簡單字節,操作系統將調整文件大小以允許在請求的位置進行寫入。

Dim testfile as String = "d:\temp\testfile.bin" 
    Dim fs As FileStream = File.Create(testfile) 
    Dim utf8 As UTF8Encoding = new UTF8Encoding() 
    Dim bw As BinaryWriter = new BinaryWriter(fs, utf8) 
    bw.Seek(1500, SeekOrigin.Begin) 'only 1500 bytes just for test 
    bw.Write(255) 
    fs.Close() 
+0

不錯!但是,2GB對於BinaryWriter.Seek中的Int32偏移參數來說太大了一個字節。編輯,沒關係,我猜想,因爲它是偏移量,Int32.MaxValue將完全是2GB。 – Louis

+1

參數[SeekOrigin](http://msdn.microsoft.com/en-us/library/883dhyx0.aspx)也可以設置爲_Current_。因此,用Begin(從零開始)編寫第一個字節,然後用Current(最後寫入pos)寫入另一個字節。 – Steve

+0

哇!太棒了。我擔心在一行中寫入文件需要很長時間(bw.write(255)),但不知何故,就像你說的那樣,操作系統會優化它,讓它在瞬間完成。太棒了。它有一個用整數填充文件的重載(在我的情況下爲零)。我能夠得到我需要的確切大小。 – John

0

這並不十分有效,但我在38秒寫了2gig文件,在調試模式下首先編譯...

StringBuilder s = new StringBuilder(); 
for (int i = 0; i <= 4000; i++) s.Append("0"); 

System.Diagnostics.Stopwatch t = System.Diagnostics.Stopwatch.StartNew(); 
using (StreamWriter file = new StreamWriter(@"c:\temp\temp.text")) 
{ 
     for (long i = 0; i < 2147483648; i+= 4000) 
     file.Write(s.ToString()); 
} 
this.label1.Text = t.Elapsed.TotalSeconds.ToString(); 

2音樂會根據谷歌是this much

所以,我不知道,你想要多快?