Мне нужно работать с большими списками поплавков, но я нажимаю ограничения памяти на системах x86. Я не знаю конечной длины, поэтому мне нужно использовать расширяемый тип. В системах x64 я могу использовать <gcAllowVeryLargeObjects>
.
Мой текущий тип данных:
List<RawData> param1 = new List<RawData>();
List<RawData> param2 = new List<RawData>();
List<RawData> param3 = new List<RawData>();
public class RawData
{
public string name;
public List<float> data;
}
Длина списков paramN низка (в настоящее время 50 или ниже), но данные могут быть 10 м+. Когда длина равна 50, я попадаю на пределы памяти (OutOfMemoryException
) только на 1 м данных, а когда длина равна 25, я достигал предела чуть выше 2 м точек данных. (Если мои вычисления правильные, это ровно 200 МБ, плюс размер имени плюс накладные расходы). Что я могу использовать для увеличения этого предела?
Изменить: Я попытался использовать List<List<float>>
с максимальным размером внутреннего списка 1 < < 17 (131072), что несколько увеличило предел, но все же не настолько, насколько я хочу.
Edit2: Я попытался уменьшить размер куска в списке > до 8192, и я получил OOM на уровне ~ 2,3 м, а диспетчер задач с чтением ~ 1,4 ГБ для процесса. Похоже, мне нужно сократить использование памяти между источником данных и хранилищем или чаще запускать GC - я смог собрать 10 м точек данных в процессе x64 на ПК с 4 ГБ оперативной памяти, IIRC, процесс никогда не превышал 3 ГБ
Edit3: Я скомпилировал свой код только для тех частей, которые обрабатывают данные. http://pastebin.com/maYckk84
Edit4: Я посмотрел в DotMemory и обнаружил, что моя структура данных занимает ~ 1 ГБ с настройками, которые я тестировал (50ch * 3 params * 2m events = 300,000,000 float элементов), Я думаю, мне нужно будет ограничить его на x86 или выяснить, как писать на диск в этом формате, когда я получаю данные