Tengo una serie de cortos (short []) que debo escribir en un archivo. ¿Cuál es la forma más rápida de hacer esto?¿Cuál es la mejor manera de escribir una matriz corta [] en un archivo en C#?
Respuesta
Uso del 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);
}
}
}
}
Aquí hay una mejor manera: convierte tu matriz corta en una matriz de bytes usando Buffer.BlockCopy y luego serializar eso en su lugar. Mucho más rápido (incluida la parte de conversión). O utilice BinaryFormatter hacia arriba, que es muy rápido para matrices con elementos primitivos. –
El seguimiento de la respuesta de Jon B, si el archivo contiene otros datos, es posible que desee prefijar los datos con la cuenta de valores.
es decir:
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);
}
}
}
}
BinaryFormatter trata de hecho de 10 veces más rápido tanto para lectura y escritura cuando se utiliza con arrays de tipos primitivos, es decir, no por (obj.GetType() IsPrimitive.) Decimal y String (que no son primitivos) y ciertamente no para ninguna otra estructura o clase donde, en cambio, es terriblemente lento.
[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);
}
}
Salida:
BinaryFormatter serialize: 175 ms, 200000028 bytes
BinaryFormatter deserialize: 79 ms, 200000028 bytes
BinaryWriter serialize: 1499 ms, 200000004 bytes
BinaryReader deserialize: 1599 ms, 200000004 bytes
Así que utilice BinaryFormatter cada vez que tenga una matriz de un tipo primitivo, o matriz de matrices, pero no matrices multi-dim (!). Si su tipo de datos es, por ejemplo, Point3 (doble), debe completar un doble [] y serializarlo en su lugar. Utilice únicamente BinaryWriter para tipos complejos/mixtos, cadenas, decimales y valores singulares.
Al tratar con byte [], BinaryFormatter y BinaryWriter tienen el mismo rendimiento (y son muy rápidos). Si puede convertir su tipo a matriz de bytes de una manera efectiva, puede obtener un rendimiento aún más rápido de esta manera.
- 1. ¿Cuál es la mejor manera de escribir comentarios en C?
- 2. ¿Cuál es la mejor manera de escribir en un archivo en un hilo paralelo en Java?
- 3. ¿Cuál es la mejor manera de escribir un archivo grande en un disco en PHP?
- 4. ¿Cuál es la mejor manera de escribir los contenidos de un StringIO en un archivo?
- 5. ¿Cuál es la mejor manera de escribir en un archivo en Ruby?
- 6. ¿La mejor manera de escribir matrices en un archivo?
- 7. ¿Cuál es la mejor manera de escribir el código python en un archivo python?
- 8. ¿cuál es la mejor manera de verificar una matriz vacía?
- 9. ¿Cuál es la mejor manera de encriptar una cadena muy corta en PHP?
- 10. ¿Cuál es la mejor manera de serializar una matriz basada en una interfaz en WCF?
- 11. ¿Cuál es la mejor manera de crear una matriz dispersa en C++?
- 12. ¿Cuál es la mejor manera de crear una matriz de solo lectura en C#?
- 13. ¿Cuál es la mejor manera de truncar el comienzo de un archivo en C?
- 14. ¿Cuál es la mejor manera de leer un archivo completo en std :: string en C++?
- 15. ¿Cuál es la mejor manera de leer y escribir documentos cXML en C#?
- 16. ¿Cuál es la mejor manera de permitir que un usuario busque un archivo en C#?
- 17. ¿Manera corta de escribir un evento?
- 18. ¿Cuál es la mejor manera de escribir código genérico de plantilla de clase en C?
- 19. ¿Cuál es la mejor manera de leer un archivo de texto delimitado por tabulaciones en C#
- 20. ¿Cuál es la mejor manera de escribir una aplicación de línea de comandos en Java?
- 21. ¿Cuál es la mejor manera de enviar un archivo a través de una red usando C#?
- 22. ¿Cuál es la mejor manera de dibujar en la consola?
- 23. ¿Cuál es la mejor manera de crear una matriz secundaria a partir de una matriz existente en C++?
- 24. ¿Cuál es la mejor manera de escribir [0..100] en C#?
- 25. ¿Cuál es la mejor manera de verificar si un archivo existe en C++? (plataforma cruzada)
- 26. ¿Cuál es la MEJOR manera de reemplazar texto en un archivo usando C#/.NET?
- 27. ¿Cuál es la mejor manera de fundir una lista en un vector?
- 28. ¿cuál es la mejor manera de editar el archivo csv
- 29. ¿Cuál es la mejor manera de hacer bucles en JavaScript
- 30. ¿Cuál es la mejor manera de almacenar cadenas UTF-8 en memoria en C/C++?
Me acabo de dar cuenta de que "una serie de pantalones cortos" suena algo gracioso. Lo siento, esta es una pregunta real. – MusiGenesis
Ayudaría si mencionas en qué formato quieres que estén. Binario, legible para humanos, coma separada, uno por línea ... – tvanfosson