Как написать список структур в файл в C #? - PullRequest
0 голосов
/ 08 ноября 2019

Я собираюсь использовать List в качестве структуры данных для временного сохранения данных в реальном времени, и я хочу записать их в файл.

Программа получает миллионы данных в режиме реального времени, поэтому я хочу уменьшить как можно больше задержек и накладных расходов. Сначала я просто объединил данные (String) и сохранил их в String (в список), но я обнаружил, что лучше использовать фиксированный список со структурами, потому что процесс объединения строк стоит дорого (дозапись файла при временном сохранении данных в реальном времени).

Теперь мне интересно, как эффективно записать структуры в списке в файл.

List<struct_string> struct_list = new List<struct_string>(1000000);


FileStream fileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fileStream);

for (int num = 0; list_structs.Count > num; num++)
{
    streamWriter.Write( list_structs[num].string1 + ", " +
                        list_structs[num].string2 + ", " +
                        list_structs[num].string3 + ", " +
                        list_structs[num].string4 + ", " +
                        list_structs[num].string5 + "\r\n");
}

internal struct struct_string
{
    public string string1;
    public string string2;
    public string string3;
    public string string4;
    public string string5;

    public struct_string(string _string1, string _string2, string _string3, string _string4, string _string5)
    {
        string1 = _string1;
        string2 = _string2;
        string3 = _string3;
        string4 = _string4;
        string5 = _string5;
    }
}

Это то, что я мог изначальноподумайте, но я думаю, что должны быть встроенные функции или более эффективные способы сделать это.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Попробуйте вместо этого использовать сериализацию, у вас есть библиотеки для этого, и с новым System.Text.Json в .NET Core вы получаете действительно хорошую производительность, еще одна популярная версия - Newtonsoft для стандарта .NET.

Я знаю этоне прямой ответ на ваш вопрос, но я надеюсь, что это поможет.

1 голос
/ 08 ноября 2019

Чтобы прочитать / записать их в двоичный файл, сделайте следующее:

Определите структуру:

[Serializable]
public struct X
{
    public int N {get; set;}
    public string S {get; set;}
}

Прочитайте и запишите ее, используя BinaryFormatter:

string filename = @"c:\temp\list.bin";
var list = new List<X>();
list.Add(new X { N=1, S="No. 1"});
list.Add(new X { N=2, S="No. 2"});
list.Add(new X { N=3, S="No. 3"});
BinaryFormatter formatter = new BinaryFormatter();
using (System.IO.Stream ms = File.OpenWrite(filename))
{
    formatter.Serialize(ms, list);
}

using (FileStream fs = File.Open(filename, FileMode.Open))
{
    object obj = formatter.Deserialize(fs);
    var newlist = (List<X>)obj;
    foreach (X x in newlist)
    {
        Console.Out.WriteLine($"N={x.N}, S={x.S}");
    }
}

В решении используется сериализуемый класс List и структура X.

...