#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 минутами) читать текст строчка за строчкой и воссоздавать таким образом все мои объекты.