Сериализация большого списка объектов с использованием newtonsoft json C# - PullRequest
0 голосов
/ 31 января 2020

У меня есть мой объект, как показано ниже

public class CustomizedObject
{
    public int KeyId { get; set; }
    public string SomeName { get; set; }
    public DateTime StartDate { get; set; }
    public bool isPossible { get; set; }

    //Below dictionary is hug contains more than 300k rows (300*1000) 
    public Dictionary<string, SomBigObject> BigObjectMap { get; set; }

}

public class SomBigObject
{
    //This object has so many properties of all type (int, float, datetime, enum, double, bool) 
    //+ another customized user object Lists
}

Я пытаюсь сериализовать этот объект, используя библиотеку newtonsoft json в C#, используя настройки ниже.

var settings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                NullValueHandling = NullValueHandling.Ignore,
                ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
                Formatting = Formatting.Indented
            };
var json = JsonConvert.SerializeObject(value, settings);

Но это Исключение нехватки памяти. Если я уменьшу количество строк до небольшого числа, например, 100 тыс. Строк, то все будет работать нормально.

После исключения из памяти на моем компьютере останется 5 ГБ ОЗУ.

После сериализации этого объект, я хочу сохранить его в распределенном кэше (Apache Ignite).

Пожалуйста, дайте мне знать, какие альтернативы я могу попытаться решить эту проблему.

Ответы [ 2 ]

1 голос
/ 31 января 2020

В принципе, не совсем понятно, чего вы пытаетесь достичь с помощью Ignite, но вот мои наблюдения. Вам не нужно сериализовать ваши данные вручную. Ignite достаточно умен, чтобы выполнить эти вещи для вас. Более того, контрпродуктивно сохранять данные в виде одного пакета строк.

Вы можете попытаться использовать колокейшн данных и иметь два кэша - один для CustomizedObject, а второй для SomBigObject * 1005. * [1] и заполните последний, используя DataStreamer [2] . Что касается сериализации, Ignite хранит все данные в своем собственном двоичном формате [3] для предоставления необходимых API, таких как, например, SQL. Для больших пользовательских объектов обычной практикой является реализация интерфейса IBInarizable [4] и получение преимуществ от методов GetRawReader и GetRawWriter.

0 голосов
/ 31 января 2020

Ваш словарь можно просмотреть как IEnumerable<KeyValuePair<string, SomBigObject>>. Почему бы вам не разбить это на куски по 100 тыс. Строк и не сохранить их по одному?

...