我有一組短褲(短[]),我需要寫出一個文件。什麼是最快的方法來做到這一點?用C#編寫一個簡短的[]數組到一個文件的最好方法是什麼?
6
A
回答
11
使用的BinaryWriter
static void WriteShorts(short[] values, string path)
{
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
foreach (short value in values)
{
bw.Write(value);
}
}
}
}
2
喬恩B的回答跟進,如果你的文件包含的任何其他數據,你可能要與值的計數的前綴數據。
即:對於
static void WriteShorts(short[] values, string path)
{
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
// Write the number of items
bw.Write(values.Length);
foreach (short value in values)
{
bw.Write(value);
}
}
}
}
1
的BinaryFormatter實際上大約快10倍既用於讀出,並與基本類型數組使用時寫入的,即不()obj.GetType(IsPrimitive。)十進制和字符串(這不是原始的),當然不適用於任何其他結構或類,而是非常緩慢。
[Test]
public void TestShortArray()
{
var n = 100000000;
var input = new short[n];
var r = new Random();
for (var i = 0; i < n; i++) input[i] = (short)r.Next();
var bf = new BinaryFormatter();
var sw = new Stopwatch();
using (var ms = new MemoryStream())
{
sw.Start();
bf.Serialize(ms, input);
sw.Stop();
Console.WriteLine("BinaryFormatter serialize: " +
sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes");
sw.Reset();
ms.Seek(0, SeekOrigin.Begin);
sw.Start();
var output = (short[])bf.Deserialize(ms);
sw.Stop();
Console.WriteLine("BinaryFormatter deserialize: " +
sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes");
Assert.AreEqual(input, output);
}
sw.Reset();
using (var ms = new MemoryStream())
{
var bw = new BinaryWriter(ms, Encoding.UTF8, true);
sw.Start();
bw.Write(input.Length);
for (var i = 0; i < input.Length; i++) bw.Write(input[i]);
sw.Stop();
Console.WriteLine("BinaryWriter serialize: " +
sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes");
sw.Reset();
ms.Seek(0, SeekOrigin.Begin);
var br = new BinaryReader(ms, Encoding.UTF8, true);
sw.Start();
var length = br.ReadInt32();
var output = new short[length];
for (var i = 0; i < length; i++) output[i] = br.ReadInt16();
sw.Stop();
Console.WriteLine("BinaryReader deserialize: " +
sw.ElapsedMilliseconds + " ms, " + ms.ToArray().Length + " bytes");
Assert.AreEqual(input, output);
}
}
輸出:
BinaryFormatter serialize: 175 ms, 200000028 bytes
BinaryFormatter deserialize: 79 ms, 200000028 bytes
BinaryWriter serialize: 1499 ms, 200000004 bytes
BinaryReader deserialize: 1599 ms, 200000004 bytes
因此,使用BinaryFormatter的,只要你有一個基本類型的數組,或數組而不是多暗淡數組的數組(!)。如果你的數據類型是例如Point3(double),你應該填充一個double []並且序列化它。僅對BinaryWriter使用複雜/混合類型,字符串,小數和奇異值。
當處理byte []時,BinaryFormatter和BinaryWriter同樣是高性能的(並且速度非常快)。如果你能夠以有效的方式將你的類型轉換爲字節數組,你可以通過這種方式獲得更快的性能。
相關問題
- 1. 什麼是一個簡單的方法來保存一組數組到一個文件並返回到C++?
- 2. 什麼是最好的方式遍歷一個數組列表
- 3. 最簡單的方法來編寫一個ArrayList到Java文本文件
- 4. 在C#中編寫以下函數的更簡短的方法是什麼?
- 5. 使用Chrome文件界面編寫文件最簡單的方法是什麼?
- 6. 什麼是輸出一個asp.net,C#GridView到PDF的好方法
- 7. 什麼是最簡單的方式來編寫一個最小的'文件票'網絡應用程序?
- 8. 什麼是創建一個結構數組最簡單的方法?
- 9. 從數組寫入CSV文件最簡單的方法是什麼?
- 10. 將數組寫入文件的最佳方法是什麼?
- 11. 寫一個數組到一個文件
- 12. 最好的方式,如果一個變量是一個數組
- 13. 編寫事件的簡短方法?
- 14. 做一個查詢:最好的方法是什麼?
- 15. 用Perl編寫gunzip文件的最佳方法是什麼?
- 16. 解析這個配置文件的最好方法是什麼?
- 17. 將一個System.Data.DataSet導入Excel的最簡單方法是什麼?
- 18. 以多平臺的方式將4個數組寫入文件的最簡單方法是什麼?
- 19. 什麼是在瀏覽器中打開一個文件的最好方法
- 20. 是用C#編寫一個變量到文件地址的任何方法
- 21. 在java中編寫文本文件的最簡單方法是什麼
- 22. 用Java編寫整數數組到文件的最快方法?
- 23. 什麼是讀取另一個進程正在寫入的文件的最好(影響最小?)方法?
- 24. 用C#編寫批處理腳本的好方法是什麼?
- 25. 寫這個JQuery代碼的最好方法是什麼?
- 26. JQuery創建一個數組 - 如何/什麼是最好的
- 27. 有條件地執行一個函數的最好方法是什麼?
- 28. c#寫一個數組列表到一個文本文件
- 29. 用C++編寫一個簡單的類
- 30. 寫一個Cocoa前端到Erlang應用程序的好方法是什麼?
我剛剛意識到「短褲陣列」聽起來很有趣。對不起,這是一個真正的問題。 – MusiGenesis 2008-10-22 02:17:35
這將有助於如果你提到你想要的格式,它們在二進制,人類可讀的,逗號分隔,每行一個...... – tvanfosson 2008-10-22 02:23:08