Это проблема с C#. У меня есть большой объект в памяти в определенное время. Я хочу сериализовать его в файл. Для этого есть два шага. 1st, мне нужно изменить объект на строку csv. Во-вторых, мне нужно сериализовать строку csv.Как уменьшить потребление памяти?
У меня есть утилита, которая может добавлять строки в MemoryStream. Я использую этот утилитный инструмент для преобразования большого объекта в строку csv (в большой строке MemoryStream). После преобразования большого объекта в MemoryStream я создаю StreamReader из MemoryStream и вызываю его метод StreamReader.ReadToEnd() для преобразования MemoryStream в (длинную) строку. Затем я вызываю info.AddValue («BigObject», строка); для сериализации строки.
Как видно, в памяти я фактически буду хранить три копии большого объекта. Первый - это сам объект, второй - MemoryStream, содержащий строку csv, а третья - это строка, которая на самом деле является избыточной памяти MemoryStream.
Есть ли способ уменьшить потребление памяти в этой процедуре? Похоже, что если не MemoryStream, мне все равно придется использовать StringBuilder для хранения строки csv большого объекта, и мне все равно нужно будет вызвать StringBuilder.ToString(), чтобы получить окончательную строку. Затем финальная строка и StringBuilder будут сосуществовать в памяти и потреблять тот же объем памяти, что и в настоящее время MemoryStream и string.
Любая идея приветствуется. Спасибо.
Я не думаю, что 'StringBuilder.ToString()' фактически возвращает отдельную выделенную строку, чтобы, по крайней мере, сохранить одну копию. – jerryjvl
Насколько велики эти большие объекты кстати? ... если он преодолеет магический (текущий) предел в 85 КБ, у вас могут возникнуть другие проблемы, связанные с фрагментацией памяти. – jerryjvl
jerryvl, вы правы, что он не копирует новую строку. Тем не менее, строка действительно перераспределяется внутри, когда она превышает ее предел, используя алгоритм удвоения. Итак, если у меня есть правильная математика, это приведет к распределению в два раза больше памяти, чем возвращаемая строка, в кусках разных размеров. –