Ошибка нехватки памяти при создании больших списков в памяти vb.net - PullRequest
1 голос
/ 03 ноября 2019

Мне нужно работать с большим количеством данных в памяти. Я загружаю его из базы данных SQLite на SSD и использую EF6 для создания из него бизнес-объектов. Как только окно Process Memory показывает использование, превышающее 3,2 ГБ, я получаю исключение Out Of Memory из Entity Framework.

На данный момент я просто загружаю в списки. Я где-то читал, что существуют ограничения на размеры структур списков, поэтому вместо использования одного большого списка я создал несколько простых объектов-контейнеров DataBlock, каждый из которых содержит кусок необходимых данных. Кажется, это не имеет никакого значения. ПК имеет много оперативной памяти (16 ГБ). Я использую новый контекст для заполнения каждого блока данных, а затем уничтожаю их.

For Each DataBlock In DataBlocks
    Using Context As New mainEntities
        Dim FirstRecordTimeUTC As Long = TimeFunctions.ConvertDateToUTC(DataBlock.StartDate)
        Dim LastRecordTimeUTC As Long = TimeFunctions.ConvertDateToUTC(DataBlock.EndDate)

        Dim CandlesInRange = (From Cand In Context.HistoricalRecords
                              Where Cand.time_close_utc >= FirstRecordTimeUTC
                              Where Cand.time_close_utc <= LastRecordTimeUTC
                              Order By Cand.id
                              Select Cand).ToList
        DataBlock.AllCandles = CandlesInRange

        Dim RTsInRange = (From Cand In Context.HistoricalRecordRealTimes
                          Where Cand.time_close_utc >= FirstRecordTimeUTC
                          Where Cand.time_close_utc <= LastRecordTimeUTC
                          Order By Cand.id
                          Select Cand).ToList
        DataBlock.AllRTs = RTsInRange

        Dim StatsInRange = (From Cand In Context.InstrumentStats
                            Where Cand.time_close_utc >= FirstRecordTimeUTC
                            Where Cand.time_close_utc <= LastRecordTimeUTC
                            Order By Cand.id
                            Select Cand).ToList
        DataBlock.AllStats = StatsInRange
    End Using 
Next

Платформа компилятора установлена ​​на «Любой ЦП». Система работает следующим образом:

Win 10 64, VS 2017, 16 ГБ ОЗУ, Ryzen 5 3600

Любые мысли о том, что я делаю неправильно, будут высоко оценены.

1 Ответ

0 голосов
/ 09 ноября 2019

Visual Vincent лучше всего ответил на этот вопрос в комментариях:

В проектах, ориентированных на AnyCPU и .NET 4.5 и выше, по умолчанию используется конфигурация «32-разрядный предпочтительный AnyCPU». Это означает, что ваше приложение всегда будет скомпилировано как 32-разрядное приложение (которое по умолчанию ограничено 4 ГБ ОЗУ) даже в 64-разрядной системе, за исключением случаев, когда вы работаете на процессоре ARM (в которомесли он будет скомпилирован в ARM).

Вам необходимо настроить классическую конфигурацию AnyCPU, чтобы приложение могло скомпилироваться как 64-разрядное приложение в 64-разрядной системе. Щелкните правой кнопкой мыши свой проект в обозревателе решений и нажмите «Свойства», перейдите на вкладку «Компиляция» и снимите флажок «Предпочитать 32-разрядный» (он также может быть в разделе «Дополнительные параметры компиляции» ... Передо мной нет VS). на данный момент).

Он также упомянул еще один вопрос, объясняющий этот параметр: Для чего предназначен параметр «Предпочитать 32-разрядный» в Visual Studio и как он на самом деле работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...