Entity Framework, двоичные данные и LOH
Мне нужно хранить довольно большое количество двоичных данных в базе данных (MS SQL) и взаимодействовать с этой базой данных через EF. К сожалению, EF не поддерживает FILESTREAM (точнее, потоковой поддержки нет).
Итак, я решил хранить данные кусками. Чанк - это просто тип сущности:
public class Data
{
public int Id { get; set; }
public Collection<Chunk> Chunks { get; set; }
}
public class Chunk
{
public int Id { get; set; }
public int DataId { get; set; }
public byte[] Content { get; set; }
}
Во-первых, я хотел ограничить размер чанка некоторым оптимальным значением, скажем, 1 Мб.
Но потом я вспомнил о больших объектах и LOH.
Насколько я понимаю, каждый Chunk.Content
Экземпляр будет рассматриваться как большой объект со следующими последствиями (особенно фрагментация памяти). Следовательно, интенсивное создание Chunk
объекты, наконец, вызовут OutOfMemoryException
(это приложение "24/7", и работа с этими двоичными данными является основной целью приложения).
Я не могу повторно использовать любой буфер для блоков данных, потому что я использую EF...
Должен ли я уменьшить размер куска, уменьшив его до 85K?
Или это паранойя?:)
1 ответ
Проблема фрагментации LOH может возникнуть, только если у вас в памяти слишком много блоков одновременно, но из вашего описания похоже, что у вас будет один блок на "процесс". Сколько параллельных процессов вы ожидаете иметь? Если вы ожидаете много процессов, вы, скорее всего, также ожидаете HW с достаточной вычислительной мощностью и памятью (64-битная платформа). Разве HW не является реальным ограничением для обработки большого количества параллельных блоков?
В любом случае, если вам нужно сохранить поток в базе данных, вы должны просто использовать FILESTREAM
без EF. Пребывание в EF любой ценой является провалом архитектуры.