Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';tr是否分配与Python一样多的RAM?还是有不同的解释?_Python_R_Limit - Fatal编程技术网

为什么可以';tr是否分配与Python一样多的RAM?还是有不同的解释?

为什么可以';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:

我听了之后,毫无问题地运行了发布在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:
          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