为什么我在处理3中的素因分解代码会使用那么多的内存,如何使它使用更少的内存?

问题描述 投票:1回答:1

我写了一些代码来创建每个数字的素数分解列表。该代码可以正常工作,以制作1,000,000个或更少的元素列表,但是当我尝试制作更大的列表时,内存不足。我能够在大约100秒内以Processing的默认内存限制256MB列出1,000,000个元素。将内存限制增加到1024MB,代码将运行约45分钟,然后在尝试列出2,000,000个元素时耗尽内存。我相信这个问题与内存管理有关。

这里是代码。

int listLength=1000;
boolean failed=false;

void setup() {
  int time=millis(); //keep track of how long it takes to do things
  //get prime data
  String[] primesString=loadStrings("primes.txt");
  int[] primes=new int[primesString.length];
  for(int i=0; i<primes.length; i++) {
    primes[i]=int(primesString[i]);
  }
  println("loaded primes in "+((float(millis())-time)/1000)+" seconds");
  //do prime factorizations
  String[] list=new String[listLength];
  for(int i=0; i<listLength; i++) {
    int boi=i+1;
    list[i]=boi+"=";
    int primeIndex=0;
    while(boi!=1) {
      if(primeIndex==primes.length) { println("ERROR: not enough primes indexed"); boi=1; i=listLength; failed=true; }
      else {
        if(boi%primes[primeIndex]==0) {
          int count=1; boi/=primes[primeIndex];
          while(boi%primes[primeIndex]==0) {
            boi/=primes[primeIndex];
            count++;
          }
          list[i]+="p"+primeIndex+"^"+count+"*"; //list[i]+=primes[primeIndex]+"^"+count+"*";
        }
        primeIndex++;
      }
    }
    list[i]=list[i].substring(0, list[i].length()-1);
  }
  println("prime factored in "+((float(millis())-time)/1000)+" seconds");
  //save data
  if(!failed) {
    saveStrings(listLength+" prime factored.txt", list);
  }
  println("saved data in "+((float(millis())-time)/1000)+" seconds");
  //close program
  exit();
}
java memory processing prime-factoring
1个回答
1
投票

主要问题是,您将整个输出生成到内存中的字符串列表(list)中,并在最后将其写入文件中。逐行写入文件。不必将字符串保留在内存中。使用createWriter(),并按createWriter()将每一行写入文件(请参见.println())。此外,没有必要将PrintWriter的列表保留在内存中。在您的算法中,仅需要整数质数。将读取源数据的代码移到一个函数中,然后字符串列表就在该函数的作用域内是局部的:

PrintWriter
© www.soinside.com 2019 - 2024. All rights reserved.