如何在C++; 我在C++中做了一个质数查找器,它将素数写入了.txt文件,但是在找到第一亿零二百一十四万四千零一(2084058601)之后崩溃了。它还将找到的素数存储在一个向量中,因此它不必除以每一个小于当前检查数平方根的数,只需除以素数即可。它在每(10240n+1)次找到素数之后调整存储素数的向量的大小,而102144001是10240n+1,因此它在调整大小时崩溃。我使用了一个无符号向量int64,所以它崩溃时使用了780兆字节,但我有8GB的RAM。我应该使用vector.reserve()吗?(我不希望50分钟后再次崩溃…

如何在C++; 我在C++中做了一个质数查找器,它将素数写入了.txt文件,但是在找到第一亿零二百一十四万四千零一(2084058601)之后崩溃了。它还将找到的素数存储在一个向量中,因此它不必除以每一个小于当前检查数平方根的数,只需除以素数即可。它在每(10240n+1)次找到素数之后调整存储素数的向量的大小,而102144001是10240n+1,因此它在调整大小时崩溃。我使用了一个无符号向量int64,所以它崩溃时使用了780兆字节,但我有8GB的RAM。我应该使用vector.reserve()吗?(我不希望50分钟后再次崩溃…,c++,vector,primes,ram,C++,Vector,Primes,Ram,好吧,可用内存和可用内存不一样 cppfreference矢量的元素是连续存储的。因此,问题不在于你有多少RAM,而在于你在程序运行时有多少连续RAM。如果一个向量必须是连续的,那么该向量不能扩展到连续内存的最大可用部分之外 因此,当向量需要调整大小时,也可能会遇到问题。如果向量与一个大的连续内存块相邻,那么它可以扩展到大的内存块;但是,如果向量位于太小的块中,则它必须将自身复制到新位置。。。这需要时间 容器可能是更好的选择,因为它不需要连续的存储位置。这允许您利用更多的可用RAM,并避免在调整

好吧,可用内存和可用内存不一样

cppfreference矢量的元素是连续存储的。因此,问题不在于你有多少RAM,而在于你在程序运行时有多少连续RAM。如果一个向量必须是连续的,那么该向量不能扩展到连续内存的最大可用部分之外

因此,当向量需要调整大小时,也可能会遇到问题。如果向量与一个大的连续内存块相邻,那么它可以扩展到大的内存块;但是,如果向量位于太小的块中,则它必须将自身复制到新位置。。。这需要时间

容器可能是更好的选择,因为它不需要连续的存储位置。这允许您利用更多的可用RAM,并避免在调整大小期间进行代价高昂的复制操作


(如果您担心标准是否保证向量是连续的(因此可能导致OP的问题),并且可能有助于阐明这一问题。)

那么,可用内存与可用内存不同

cppfreference矢量的元素是连续存储的。因此,问题不在于你有多少RAM,而在于你在程序运行时有多少连续RAM。如果一个向量必须是连续的,那么该向量不能扩展到连续内存的最大可用部分之外

因此,当向量需要调整大小时,也可能会遇到问题。如果向量与一个大的连续内存块相邻,那么它可以扩展到大的内存块;但是,如果向量位于太小的块中,则它必须将自身复制到新位置。。。这需要时间

容器可能是更好的选择,因为它不需要连续的存储位置。这允许您利用更多的可用RAM,并避免在调整大小期间进行代价高昂的复制操作


(如果您担心标准是否保证向量是连续的(因此可能导致OP的问题),并可能有助于阐明这一问题。)

只有4730个素数比2084058601的平方根小。如果在存储少量数据时内存不足,则说明您做错了什么


我最近写了一个素数生成器,并用它对前十亿个素数求和。它使用一个分段的埃拉托斯坦筛,并在每个分段的开始处添加额外的筛分底漆。对于位数组的大小,内存使用是恒定的,对于筛选素数,内存使用增长缓慢。您可能想看看。

只有4730个素数比2084058601的平方根小。如果在存储少量数据时内存不足,则说明您做错了什么


我最近写了一个素数生成器,并用它对前十亿个素数求和。它使用一个分段的埃拉托斯坦筛,并在每个分段的开始处添加额外的筛分底漆。对于位数组的大小,内存使用是恒定的,对于筛选素数,内存使用增长缓慢。你可能想看看。

老实说,我怀疑这是你的问题。在64位操作系统上,您应该有足够的地址空间,因此只有在交换空间用完时才会遇到问题

我猜你的问题是篱笆柱的问题。事实上,你甚至认为你需要调整大小,链推回应该足够了


你撞车的细节可能值得一看。您可能还想了解std vector在无法分配内存时抛出的异常。另一个问题是io可能比计算慢得多,如果您知道崩溃的最后一位数字,而不是崩溃的方式,那么可能是打印太多了。

老实说,我怀疑这是您的问题。在64位操作系统上,您应该有足够的地址空间,因此只有在交换空间用完时才会遇到问题

我猜你的问题是篱笆柱的问题。事实上,你甚至认为你需要调整大小,链推回应该足够了


你撞车的细节可能值得一看。您可能还想了解std vector在无法分配内存时抛出的异常。另一个问题是io可能比计算慢得多,如果您知道最后一位崩溃的位置,而不是崩溃的方式,则可能是打印太多。

尝试使用deque,它可能也会快得多,我怀疑内存分配器的限制。如果您提前知道您正在使用大量内存,一次分配所有资源,例如使用
vector::reserve
reserve
over
resize
的好处是
back
push_back
的行为仍然有意义,而不是手动维护当前界限。您可以执行一些测试,只需将任意值存储在向量中,看看它能容纳多少值,这样您就不会花费太多的时间在实际操作中寻找素数。你不需要存储那么多的数字。因为检查N的平方根就足够了,所以对于每个美国人来说,1e9的素数就足够了。@PavelRadzivilovsky这是个好主意,谢谢!尝试使用deque,它可能也会快得多,我怀疑是内存分配器