Мне нужно создать довольно большой двойной массив 12000ish x 55000ish. К сожалению, я получаю исключение из памяти. Я использовал для разработки на Java и мог изменять настройки памяти. Возможно ли это с C# или это просто невозможно? Я использую VS 2008.OutOfMemoryException при объявлении большого массива
ответ
Каждый double
имеет 8 байтов, поэтому вы пытаетесь выделить один массив размером чуть более 5 ГБ. CLR имеет ограничение на объект около 2 ГБ IIRC, даже для 64-битной CLR. Другими словами, это не общий объем доступной памяти, это проблема (хотя, очевидно, у вас будут проблемы, если у вас нет хватает памяти), но размер каждого объекта.
Я предлагаю вам разбить его на меньшие массивы, возможно, за фасадом какого-то описания. Я не верю, что есть какой-то способ обхода этого предела для одного массива.
EDIT: Вы могли пойти на массив массивов - он же в зубчатого массива:
double[][] array = new double[12000][];
for (int i = 0; i < array.Length; i++)
{
array[i] = new double[55000];
}
это будет приемлемо для вас?
(Вы не можете использовать прямоугольный массив (double[,]
), поскольку это будет иметь ту же проблему, размер каждого-объекта.)
Ну, либо вы потеряли память (закройте некоторые программы), либо вы достигли предела распределения памяти (около 2 ГБ), эта память должна быть смежным блоком. Вы можете использовать 64-битную машину, в этом случае у вас будет больше доступной памяти, или я думаю, что вы можете сделать приложение большим адресом осведомленным (поиск в Google расскажет вам, как это сделать, если это возможно в этом случае).
Поверьте, вы добавляете ключ/3GB в файл Boot.ini для понимания большого адреса.
Поскольку вы не можете создавать объекты размером более 2 Гб, вы можете попробовать использовать MemoryMappedFile для работайте с куском памяти требуемого размера.
var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L);
var view = data.CreateViewAccessor();
var rnd = new Random();
for (var i = 0L; i < 12000L; ++i)
{
for (var j = 0L; j < 55000L; ++j)
{
var input = rnd.NextDouble();
view.Write<double>(i * 55000L + j, ref input);
}
}
При условии, что ваш общий объем памяти достаточно, вы можете предотвратить Из исключений памяти в результате фрагментации LOH, создавая кучу мелких массивов, и упаковка их в одном IList<T>
, или какой-либо другой индексируемой интерфейс.
Вот ссылка, которая описывает его:
BigArray<T>, getting around the 2GB array size limit
Кредиты: this post (C# chunked array).
- 1. Переполнение стека/кучи при объявлении большого массива
- 2. OutOfMemoryException Обработка большого файла
- 3. Ошибка сегментации в объявлении большого массива
- 4. Android OutOfMemoryException при обработке большого ответ JSON
- 5. OutOfMemoryException при итерации большого набора данных
- 6. Получение исключение переполнения стека при объявлении большого массива
- 7. NHibernate OutOfMemoryException запрос большого байта []
- 8. Заполнение массива междунар при объявлении
- 9. Инициализация массива табуляции при объявлении
- 10. Ошибка Verilog при объявлении массива
- 11. Ошибка при объявлении локального массива
- 12. используя звезды при объявлении массива
- 13. Ошибки при объявлении двумерного массива
- 14. OutOfMemoryException
- 15. System.OutOfMemoryException при распределении массива большого размера
- 16. Runtime.Caching.MemoryCache выбрасывает OutOfMemoryException при добавлении большого количества элементов в кеш
- 17. OutOfMemoryException при отправке большого файла 500MB с использованием FileStream ASPNET
- 18. outofmemoryexception при использовании большого количества изображений с прослушивателем сенсора
- 19. FileHelpers выбрасывает OutOfMemoryException при анализе большого файла csv
- 20. Экспорт большого количества данных из XLSX - OutOfMemoryException
- 21. Поврежденная ошибка кучи при объявлении двойного * массива
- 22. C: Нарушение прав доступа при объявлении массива
- 23. C: состояние памяти при объявлении массива
- 24. Использование переменной int при объявлении размера массива
- 25. ошибка при объявлении двойной массива размером 150000?
- 26. java.lang.OutOfMemoryError в Android при объявлении массива
- 27. Получение «System.OutOfMemoryException» при объявлении многомерного массива
- 28. bad_alloc при объявлении массива, кажется достаточно памяти
- 29. разница между()() и (,) при объявлении массива (vb.net)
- 30. OutOfMemoryException при чтении 500MB FileStream
A * довольно * большой массив? :) – Groo
Я бы предложил вам рассмотреть структуру данных «из основной памяти» (т. Е. Базу данных). Почему вы должны хранить такой большой двойной массив? – bitxwise
Я тоже посмеялся над выбором слова «честно». –