簡體   English   中英

為什么我在處理 3 中的質因數分解代碼使用了這么多 memory,我怎樣才能讓它使用更少的 memory?

[英]Why does my prime factorization code in processing 3 use so much memory and how can I make it use less memory?

我寫了一些代碼來創建每個數字的質因數分解列表。 該代碼按預期工作,可以制作 1,000,000 個或更少元素的列表,但當我嘗試制作更大的列表時,它會用完 memory。 我能夠在大約 100 秒內以 Processing 的默認 memory 限制 256MB 列出 1,000,000 個元素。 將 memory 限制增加到 1024MB,代碼運行了大約 45 分鍾,然后在嘗試制作包含 2,000,000 個元素的列表時用完 memory。 我認為這個問題與 memory 管理有關。

這是代碼。

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();
}

主要問題是,您將整個 output 生成到 memory ( list ) 中的字符串列表,並在最后將其寫入文件。 逐行寫入文件。 不必保留 memory 中的字符串。使用createWriter()並通過.println()將每一行寫入文件(請參閱PrintWriter )。
此外,不必在primesString中保留 primesString 列表。在您的算法中,只需要整數質數。 將讀取源數據的代碼移動到一個function,那么字符串列表就在function的scope本地:

int listLength=1000;
boolean failed=false;

int[] GetPrimeData()
{
    String[] primesString=loadStrings("primes.txt");
    int[] primes=new int[primesString.length];
    for(int i=0; i<primes.length; i++) {
        primes[i]=int(primesString[i]);
    }
    return primes;
}

void setup() {
    int time=millis(); //keep track of how long it takes to do things

    //get prime data
    int[] primes = GetPrimeData();
    println("loaded primes in "+((float(millis())-time)/1000)+" seconds");

    PrintWriter output = createWriter(listLength + " prime factored.txt"); 

    //do prime factorizations
    for (int i=0; i<listLength; i++) {
        int boi=i+1;
        String newentry = 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++;
                    }
                    newentry += "p"+primeIndex+"^"+count+"*"; //list[i]+=primes[primeIndex]+"^"+count+"*";
                }
                primeIndex++;
            }
        }
        output.println(newentry.substring(0, newentry.length()-1));
    }

    output.close();
    println("prime factored in "+((float(millis())-time)/1000)+" seconds");

    //close program
    exit();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM