Frage

Ich habe ein Array von Shorts (short []), dass ich in eine Datei zu schreiben brauchen. Was ist der schnellste Weg, dies zu tun?

War es hilfreich?

Lösung

Mit der Binary

    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);
                }
            }
        }
    }

Andere Tipps

auf Jon Anknüpfend B Antwort, wenn die Datei keine anderen Daten enthält, können Sie die Daten mit der Anzahl der Werte Präfix.

das heißt:.

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 ist in der Tat über 10-mal schneller sowohl für liest und schreibt, wenn sie mit Arrays von primitiven Typen (obj.GetType (). IsPrimitive) verwendet, also nicht für dezimal und String (was nicht primitiv ist) und schon gar nicht für andere Struktur oder Klasse, wo es stattdessen ist schrecklich langsam.

[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);
  }
}

Ausgabe:

BinaryFormatter serialize: 175 ms, 200000028 bytes
BinaryFormatter deserialize: 79 ms, 200000028 bytes
BinaryWriter serialize: 1499 ms, 200000004 bytes
BinaryReader deserialize: 1599 ms, 200000004 bytes

So BinaryFormatter verwenden, wenn Sie ein Array von einem primitiven Typ haben oder Array von Arrays, aber nicht Multi-dim-Arrays (!). Wenn Ihr Datentyp zum Beispiel Point3 (double) ist, sollten Sie eine doppelte [] und serialisiert werden, dass anstelle aufzufüllen. verwenden Binary nur für komplexe / Mischtypen, Strings, Dezimalzahlen und singulären Werte.

Wenn Sie mit Byte Umgang [] dann BinaryFormatter und Binary ist ebenso performant (und sehr schnell). Wenn Sie Ihren Typ Byte-Array in einer effektiven Art und Weise umwandeln können Sie können auf diese Weise auch die Leistung verbessert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top