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 любой ценой является провалом архитектуры.

Другие вопросы по тегам