У нас есть код вроде:
ms = New IO.MemoryStream
bin = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
bin.Serialize(ms, largeGraphOfObjects)
dataToSaveToDatabase = ms.ToArray()
// put dataToSaveToDatabase in a Sql server BLOB
Но пачка памяти выделяет большой буфер из большой кучи памяти, которая дает нам проблемы. Итак, как мы можем передавать данные без необходимости иметь достаточную свободную память для хранения сериализованных объектов.
Я ищу способ получить поток от SQL-сервера, который затем можно передать в bin.Serialize(), чтобы избежать хранения всех данных в моей памяти процессов.
Аналогично для чтения данных обратно...
Еще немного фона.
Это часть комплексной вычислительной системы, которая обрабатывает данные в режиме реального времени в поисках проблем с оборудованием и т.д., сериализация выполняется, чтобы разрешить перезагрузку при возникновении проблемы с качеством данных из фида данных и т.д. (Мы сохраняем каналы передачи данных и могут повторно запускать их после того, как оператор отредактировал плохие значения.)
Поэтому мы сериализуем объект намного чаще, чем мы де-сериализуем их.
Объекты, которые мы сериализуем, включают в себя очень большие массивы в основном из двух пар, а также множество небольших "более нормальных" объектов. Мы подталкиваем ограничение памяти на 32-битную систему и очень усложняем работу гаражного коллектора. (Эффекты выполняются в других местах системы, чтобы улучшить это, например, повторно использовать большие массивы, а не создавать новые массивы.)
Часто сериализация состояния представляет собой последняя солома, которая изучает исключение из памяти; использование пиковой памяти во время этой сериализации выполняется.
Я думаю, что мы получаем большую фрагментацию пула памяти, когда мы де-сериализуем объект, я ожидаю, что есть и другие проблемы с большой фрагментацией пула памяти, учитывая размер массивов. (Это еще не исследовано, так как человек, который сначала посмотрел на это, является экспертом по числовой обработке, а не экспертом по управлению памятью.)
Клиенты используют сочетание Sql Server 2000, 2005 и 2008, и мы предпочли бы не иметь разных кодовых путей для каждой версии Sql Server, если это возможно.
У нас может быть много активных моделей за раз (в разных процессах, на многих машинах), каждая модель может иметь много сохраненных состояний. Следовательно, сохраненное состояние сохраняется в блоке базы данных, а не в файле.
Поскольку распространение сохранения состояния важно, я бы предпочел не сериализовать объект в файл, а затем поместить файл в BLOB по одному блоку за раз.
Другие связанные вопросы, которые я задал