Быстрая десериализация или Сохранение списка пользовательских объектов

#c# #serialization #persistence

Вопрос:

Я работаю над программой, которой нужна куча предварительно рассчитанных данных, чтобы выполнить вычисления в реальном времени в удовлетворительное для пользователей время. Мне удалось выполнить свои предварительные вычисления и записать их в сериализованный файл данных (это заняло более 26 часов обработки). Данные, записанные, представляют собой простой список из 812175 пользовательских объектов «предварительной подготовки», и итоговый файл имеет размер 100 МБ.

         [Serializable]
        private class PrePairsList_IO
        {

            private List<PrePair> _pairsList;

            public PrePairsList_IO()
            {
                _pairsList = new List<PrePair>();
            }

            public List<PrePair> PairsList { get => _pairsList; set => _pairsList = value; }

        }
 

Методы чтения/записи:

 private void WriteList()
        {
            PrePairsList_IO prePairsList_IO = new PrePairsList_IO();
            List<PrePair> list = prePairsList_IO.PairsList;
            foreach (PrePair pair in pairs.Values)
            {
                list.Add(pair);
            }
            prePairsList_IO.PairsList = list;// Not sure this line required?

            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(_FileName, FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, prePairsList_IO);
            stream.Close();
        }

        private void ReadList()
        {
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(_filename, FileMode.Open, FileAccess.Read, FileShare.Read);
            PrePairsList_IO prePairsList_IO = (PrePairsList_IO)formatter.Deserialize(stream);
            stream.Close();

            List<PrePair> list = prePairsList_IO.PairsList;
            ListToDictionary(list);
        }
 

Когда я читаю данные, мои пользовательские функции работают очень быстро. Однако процесс чтения файла занимает 4 минуты, и мне нужно значительно сократить это время.
Каковы мои варианты достижения этой цели? Мне интересно, могу ли я настроить некоторую постоянную переменную списка или есть более быстрый способ десериализации данных?
Предварительно рассчитанные данные никогда не будут изменены, поэтому на данный момент их не нужно записывать.
Спасибо

Комментарии:

1. Не уверены, что эта строка обязательна? Это не. Что касается вашей проблемы, пробовали ли вы другие методы сериализации, такие как json, bson или xml?

2. Нет, это единственный подход, который я знаю. Я был бы очень признателен за примеры кода для любых предложений.

3. В Интернете есть много обучающих программ. В настоящее время json является наиболее часто используемым форматом для сериализации, вы можете использовать новую систему.Text.Json или Json.NET . Джсон. СЕТЬ также поддерживает BSON.

4. хорошо… на что это PrePair похоже?

5. Marc — PrePair содержит еще 2 пользовательских объекта. После публикации этого вопроса я попытался записать данные в виде обычного текста вместо сериализации. Я обнаружил, что гораздо быстрее (2 секунды по сравнению с 4 минутами) читать текст строчка за строчкой и воссоздавать таким образом все мои объекты.