PythonでMemoryErrorに直面する

数値の素因数を見つけるプログラムを作成しました。入力として大きな数値(600851475143)を指定すると、MemoryErrorがポップアップします。コードは次のとおりです。

def fact(a): factors = [] for i in range(1,a+1): if a%i == 0: factors.append(i) return factors num = raw_input(">> ") #600851475143 a = b = [] a = fact(long(num)) for i in range(0,len(a)): b = fact(a[i]) if len(b) <= 2: print a[i] 

ブラウジングから、Pythonがコンピューターメモリ(RAM)を使用していることがわかりました。構成を変更せずにUnbuntuでPythonを使用しています。 64ビットマシンで動作するようにanythigを変更する必要があります。または、このエラーを回避するために追加の関数を使用する必要があります

コメント

  • 基本的な問題は、アルゴリズムが多すぎる可能性があることですメモリ。 Python 2を使用している場合、range(1, a+1)は600851475143要素を含むリストを作成しようとしています。各要素は整数であり、各整数は4バイトを使用するため、これはおそらくあなたが望むものではありません。 (また、この質問は'プログラマーには適切ではありません。コードレビューが本当に必要であり、特にPythonがどのように機能するかを理解する必要があるからです。)
  • (おそらくxrangeは、必要に応じて要素をforループに返すジェネレーターです。ただし、問題が発生しているのはそれだけではない可能性があります。 。)
  • リストのサイズは2.2TBです。 64ビットマシンに切り替えても役に立ちません。 2TBを超えるRAMをインストールする必要があります(公平を期すためには、64ビットOSが必要です)。または、アルゴリズムを再考してください。
  • メモリの問題に加えて(これまで他に指摘されていないという理由だけで)、数値の因子のリストを計算したり、決定したりするためのより効率的なアルゴリズムがいくつかあります。数が素数であるかどうか、または素数のリストを生成するかどうか。ほとんどの人が時間計算量について話しますが、空間計算量の関連概念もあります。

回答

プログラムで使用されるメモリを測定するにはさまざまな方法があり、増やすことができる場合がありますユーザーごとの制限など。

ただし、すべてを保存せずにシーケンスを生成できるため、最初からそのメモリを割り当てる必要はありません。

def fact(a): "just return a generator for the sequence you want" return (i for i in xrange(1,a+1) if a % i == 0) 

シーケンスに繰り返しインデックスを付けることなく、シーケンスを直接繰り返すこともできることに注意してください:

for b in fact(long(num)): print b 

コメント

  • 質問のリストは2.2TBの大きさですが、リソース制限を引き上げても役立つとは思えません:-D
  • まあ、OPは2035年まで待つことができるかもしれません。 8TBのSIMMSが利用可能です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です