我正在創建一個臨時文件來存儲無法放入內存的巨大矩陣。我想先將臨時文件寫入磁盤,以便我可以通過流對象尋找文件中的某個位置。我已經知道我需要的確切尺寸。VB.NET用字節填充大文件
寫2千兆字節的零的最簡單方法是什麼?
我試圖一次寫入一個字節,這真的很慢。我也嘗試編寫字節數組chunck,而且速度要快得多,但是我必須吮吸數學因素,因爲我無法獲得最終的大小。
我正在創建一個臨時文件來存儲無法放入內存的巨大矩陣。我想先將臨時文件寫入磁盤,以便我可以通過流對象尋找文件中的某個位置。我已經知道我需要的確切尺寸。VB.NET用字節填充大文件
寫2千兆字節的零的最簡單方法是什麼?
我試圖一次寫入一個字節,這真的很慢。我也嘗試編寫字節數組chunck,而且速度要快得多,但是我必須吮吸數學因素,因爲我無法獲得最終的大小。
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()
不錯!但是,2GB對於BinaryWriter.Seek中的Int32偏移參數來說太大了一個字節。編輯,沒關係,我猜想,因爲它是偏移量,Int32.MaxValue將完全是2GB。 – Louis
參數[SeekOrigin](http://msdn.microsoft.com/en-us/library/883dhyx0.aspx)也可以設置爲_Current_。因此,用Begin(從零開始)編寫第一個字節,然後用Current(最後寫入pos)寫入另一個字節。 – Steve
哇!太棒了。我擔心在一行中寫入文件需要很長時間(bw.write(255)),但不知何故,就像你說的那樣,操作系統會優化它,讓它在瞬間完成。太棒了。它有一個用整數填充文件的重載(在我的情況下爲零)。我能夠得到我需要的確切大小。 – John
這並不十分有效,但我在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。
所以,我不知道,你想要多快?
另請注意,您可能會獲得O/S支持來初始創建大文件。參見'fsutil文件createnew'。 –