Я сделал первичный искатель в C ++, который записывает простые числа в файл .txt, но он потерпел крах после нахождения 102,144,001-го (2,084,058,601). Он также сохраняет найденные простые числа в векторе, поэтому ему не придется делить на каждое число меньше квадратного корня текущего проверенного числа, только на простые числа. Он изменяет размер вектора, в котором хранятся простые числа после каждого (10,240n + 1)-го найденного простого числа, а 102,144,001 равен 10,240n + 1, поэтому он потерпел крах при изменении размера. Я использую вектор без знака __int64, поэтому при сбое он использовал около 780 мегабайт, но у меня 8 ГБ ОЗУ. Должен ли я использовать vector.reserve ()? (Я не хочу еще одного сбоя через 50 минут …)
Существует только 4730 простых чисел, меньше, чем квадратный корень из 2084058601. Если у вас не хватает памяти при хранении этого небольшого объема данных, вы делаете что-то не так.
Недавно я написал простой генератор и использовал его для суммирования первого миллиарда простых чисел. Он использует сегментированное сито Эратосфена и добавляет дополнительные простые числа в начале каждого сегмента. Использование памяти постоянно для размера битового массива и медленно растет для простых чисел просеивания. Возможно, вы захотите взглянуть на Это.
Ну, доступная память не совпадает с используемой памятью.
cppreference Говорит, что элементы вектора хранятся непрерывно. Поэтому вопрос не в том, сколько у вас ОЗУ, а в том, сколько у вас было непрерывной памяти во время работы программы. Если вектор должен быть смежным, то вектор не может расширяться за пределы максимально доступного участка непрерывной памяти.
В результате вы также можете столкнуться с проблемами, когда вектор требует изменения размера. Если вектор соседствует с большим блоком смежной памяти, он может расширяться, тогда великий; однако, если вектор находится в слишком маленьком блоке, он должен скопировать себя в новое место … это занимает время.
Deque Контейнер может быть лучшим выбором, так как он не требует смежных мест хранения. Это позволяет вам использовать больше доступной оперативной памяти и позволяет избежать дорогостоящих операций копирования при изменении размера.
(Если вы беспокоитесь о том, гарантирует ли стандарт, что вектор является смежным (что потенциально может привести к проблемам ОП), читая это а также этот может помочь пролить свет на этот вопрос.)
Честно говоря, я сомневаюсь, что это ваша проблема. В 64-битной ОС у вас должно быть достаточно адресного пространства, поэтому проблемы возникают только тогда, когда у вас заканчивается своп.
Я предполагаю, что ваша проблема — проблема забора. Тот факт, что вы даже думаете, что вам нужно изменить размер, цепочка push_back должна быть более чем достаточно.
Детали вашего крушения, вероятно, стоит посмотреть. Вы также можете посмотреть, какие исключения вызывает вектор std, когда он не может выделить память. Другая проблема заключается в том, что io может быть намного медленнее, чем вычисления, и если вы знаете до последней цифры, где вы потерпели крах, а не как вы потерпели крах, возможно, вы делаете слишком много печати.