为什么可以';tr是否分配与Python一样多的RAM?还是有不同的解释?
我听了之后,毫无问题地运行了发布在GoogleColab上的代码:为什么可以';tr是否分配与Python一样多的RAM?还是有不同的解释?,python,r,limit,Python,R,Limit,我听了之后,毫无问题地运行了发布在GoogleColab上的代码: import numpy as np import math def get_primes(n_min, n_max): result = [] for x in range(max(n_min, 2), n_max): has_factor = False for p in range(2, int(np.sqrt(x)) + 1): if x % p == 0:
import numpy as np
import math
def get_primes(n_min, n_max):
result = []
for x in range(max(n_min, 2), n_max):
has_factor = False
for p in range(2, int(np.sqrt(x)) + 1):
if x % p == 0:
has_factor = True
break
if not has_factor:
result.append(x)
return result
get_primes(10**12,10**12+1000)
但当我在R中尝试类似的计算时,我在RStudio和GoogleColab(谷歌虚拟机)中得到了一个大小限制:
primesbetween谢谢,@Jean_François Fabre在我脑海中植入了这个漏洞,让我整个下午都在思考他的评论:
它与R无关。不要使用p Python通过使range()
的行为像生成器一样绕过这样的大小限制-它不会预先分配整个向量,而是在被询问时动态生成下一个数字。看起来R并没有这样做,而是预先分配整个列表,然后填充,这对于计算机的内存来说太大了。如果您执行了list(range(…)
,那么在python中可能会遇到类似的错误“不需要所有的内存,必须有一种方法在R中创建一个循环,而不分配整个数组。这与R无关。不要使用p注意,在python 2中,由于range生成完整的列表,您可能会出现相同的错误。您可以试着配置.Renviron文件,以允许R使用更多虚拟内存。根据您的操作系统,我会在耗尽物理内存的情况下抱怨内存不足。如果您使用的是zram或快速SSD,并且不介意使用交换空间,那么您可能可以使用更多的内存。要设置的环境变量称为R\u MAX\u VSIZE
。您还可以使用Sys.setenv()
动态执行此操作。
primesbetween <- function(n,m){
p <- 2:m
i <- 1
while (p[i] <= sqrt(m)) {
p <- p[p %% p[i] != 0 | p==p[i]]
i <- i+1
}
p[p >= n]
}
primesbetween(10^2,10^12 + 1000)
# Error: cannot allocate vector of size 7450.6 Gb
get_primes <- function(n_min, n_max){
options(scipen=999)
result = vector()
if(n_min<=2) result <- c(result,2)
for (x in seq(max(n_min,2), n_max)){
has_factor <- F
for (p in seq(2, ceiling(sqrt(x)))){
if(x %% p == 0) has_factor <- T
if(has_factor == T) break
}
if(has_factor==F) result <- c(result,x)
}
result
}
system.time({them_primes <- get_primes(1e12,1e12+1000)})
# user system elapsed
# 17.41 0.00 17.44
them_primes
[1] 1000000000039 1000000000061 1000000000063 1000000000091 1000000000121
[6] 1000000000163 1000000000169 1000000000177 1000000000189 1000000000193
[11] 1000000000211 1000000000271 1000000000303 1000000000331 1000000000333
[16] 1000000000339 1000000000459 1000000000471 1000000000537 1000000000543
[21] 1000000000547 1000000000561 1000000000609 1000000000661 1000000000669
[26] 1000000000721 1000000000751 1000000000787 1000000000789 1000000000799
[31] 1000000000841 1000000000903 1000000000921 1000000000931 1000000000933
[36] 1000000000949 1000000000997