Что я хочу сделать:
Напишите много небольших (в среднем 500-1000 байт) объектов, похожих на блобы, которые я получаю из очереди в базу данных SQL Server, в таблицу с первичным ключом bigint
и данными в виде столбца varbinary
.
В настоящее время я делаю это так:
- получить некоторый объект из параллельной очереди
- создать новый поток памяти и новый бинарный писатель
- сериализовать объект в поток памяти с помощью команды Write... из модуля записи
- вызовите
stream.ToArray()
и установите результат в качестве значения параметра команды SQL - выполнить команду
Это создает множество небольших массивов байтов, которые сразу после записи станут мусором. Я хотел бы избежать этого и создать только один массив байтов, всегда писать и читать из этого массива.
Но похоже, что объекты SqlCommand
внутренне копируют буфер, если вы передаете массив байтов.
Также проблема повторного использования одного и того же массива байтов снова и снова заключается в том, что я не могу сказать SqlCommand
, сколько байтов он должен записать в таблицу (каждый объект будет иметь немного другую длину)
Любая идея, как это сделать без написания моей собственной реализации SQL?
foreach
достаточно, чтобы создать временный объект итератора, который в конечном итоге потребует его сбора. Эффект усиливается в зависимости от частоты использования. Используйте его достаточно, и это тоже повод для заикания. Спросите любого разработчика игр XNA или Unity3D, который, к сожалению, застрял с технологией до .NET 4. Вот почему они используютfor
вместоforeach
. Но меня беспокоит .NET 4.5 на Windows Server? Нет - person MickyD   schedule 08.02.2017