Выделение больших блоков памяти с новым

df.reset_index (inplace = True) .. Я использовал это перед циклом for, как-то это сработало

6
задан JeffV 26 February 2009 в 12:28
поделиться

5 ответов

Относительно нового в C++/GCC/Linux (32 бита)...

Это было некоторое время, и это является зависящим от реализации, но я полагаю, что новое желание, негласно, вызывает malloc (). Malloc (), если Вы не просите что-то превышающее адресное пространство процесса, или за пределами указанного (ulimit/getrusage) пределы, не перестанет работать. Даже когда Ваша система не имеет достаточного количества RAM+SWAP. Например: malloc (1 ГБ) в системе с 256Meg RAM + 0 ПОДКАЧЕК, я верю, успешно выполнятся.

Однако, когда Вы идете использование, что память, ядро предоставляет страницы через механизм ленивого выделения. В той точке, когда Вы первое чтение или запись к той памяти, если ядро не может выделить страницы памяти Вашему процессу, она уничтожает Ваш процесс.

Это может быть проблемой на общем компьютере, когда у Вашего коллеги есть медленная базовая утечка. Особенно, когда он начинает выводить системные процессы из строя.

Так то, что Вы видите станд.:: исключения bad_alloc "интересны".

Теперь новый выполнит конструктора на выделенной памяти, касаясь всех тех страниц памяти, прежде чем она возвратится. В зависимости от реализации это могло бы захватывать сигнал из памяти.

Вы попробовали это плоскостью o'l malloc?

Вы попытались запустить "бесплатную" программу? У Вас есть достаточно памяти доступным?

Как другие предположили, Вы проверили limit/ulimit/getrusage () для трудных и мягких ограничений?

На что Ваш код похож, точно? Я предполагаю новый ClassFoo [N]. Или возможно новый символ [N].

Что такое sizeof (ClassFoo)? Что такое N?

Выделение 64*288000 (17.58Meg) должно быть тривиальным для большинства современных машин... Вы работаете на встроенной системе или чем-то в других отношениях специальном?

С другой стороны, Вы связываетесь с пользовательским новым средством выделения? Ваш класс имеет свое собственное новое средство выделения?

Ваша структура данных (класс) выделяет другие объекты как часть его конструктора?

Кто-то вмешался в Ваши библиотеки? У Вас есть несколько компиляторов установленными? Вы используете несправедливость, включают или пути к библиотеке?

Вы связываетесь против устаревших объектных файлов? Необходимо ли просто перекомпилировать Ваши все исходные файлы?

Можно ли создать тривиальную тестовую программу? Просто пара строк кода, который воспроизводит ошибку? Или Ваша проблема в другом месте, и только обнаруживающийся здесь?

--

Если это имеет значение я выделил блоки данных на более чем 2 ГБ с новым в Linux на 32 бита под g ++. Ваша проблема заключается в другом месте.

9
ответ дан 8 December 2019 в 17:27
поделиться

Возможно, что Вы ограничиваетесь ulimit процесса; выполненный ulimit -a и проверьте virutal память и данные seg пределы размера. Кроме этого, можно ли отправить код выделения, таким образом, мы видим то, что на самом деле продолжается?

4
ответ дан 8 December 2019 в 17:27
поделиться

Обновление:

Я с тех пор исправил ошибку индексации массива, и она выделяет правильно теперь.

Если я должен был предположить... Я шел на всем протяжении своей "кучи" и смешивал со структурами данных malloc. (??)

1
ответ дан 8 December 2019 в 17:27
поделиться

я предложил бы выделить всю Вашу память при запуске программы и использовать размещение, новое для расположения буферов. почему этот подход? хорошо, можно вручную отслеживать фрагментацию и такой. нет никакого портативного способа определить, сколько памяти может быть выделенной для Вашего процесса. я положителен, что существует Linux определенный системный вызов, который получит Вас, что информация (не может думать о том, что это).удачи.

0
ответ дан 8 December 2019 в 17:27
поделиться

То, что Вы получаете другое поведение, когда Вы запускаете программу в разное время, заставляет меня думать, что код выделения не является настоящей проблемой. Вместо этого кто-то еще использует память, и Вы - канарейка, узнавая, что она отсутствует.

Если это, "кто-то еще" находится в Вашей программе, необходимо смочь найти его при помощи Valgrind.

Если это, кто-то еще - другая программа, необходимо смочь решить, что путем движения в другой runlevel (хотя Вы будете не обязательно знать преступника).

0
ответ дан 8 December 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: