48
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in 
from apport.report import Report
MemoryError

Original exception was:
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError

次のプログラムを実行しようとすると、上記のエラーが発生しました。誰かがメモリエラーとは何か、そしてこの問題を克服する方法を説明できますか?。プログラムは文字列を入力として受け取り、可能なすべてのサブ文字列を見つけて、そこからセットを(辞書式順序で)作成します。ユーザーが要求したそれぞれのインデックスで値を出力する必要があります。そうでない場合は、「無効」を出力する必要があります。

def main():
    no_str = int(raw_input())
    sub_strings= []
    for k in xrange(0,no_str):
        s = raw_input()
        a=len(s)
        for i in xrange(0, a):
            for j in xrange(0, a):
                if j >= i:
                    if len(s[i:j+1]) > 0:
                        sub_strings.append(s[i:j+1])
    sub_strings = list(set(sub_strings))
    sub_strings.sort()
    queries= int(raw_input())
    resul = []
    for i in xrange(0,queries):
        resul.append(int(raw_input()))
    for p in resul:
        try:
            print sub_strings[p-1]
        except IndexError:
            print 'INVALID'


if __name__ == "__main__":
   main()
4

7 に答える 7

43

予期MemoryErrorしない事態が発生し、十分なRAMを使用できるはずだと思われる場合は、32ビットのPythonインストールを使用していることが原因である可能性があります。

64ビットオペレーティングシステムを使用している場合の簡単な解決策は、Pythonの64ビットインストールに切り替えることです。

問題は、32ビットのPythonが最大4GBのRAMにしかアクセスできないことです。オペレーティングシステムのオーバーヘッドが原因で、オペレーティングシステムが32ビットの場合、これはさらに縮小する可能性があります。

32ビットオペレーティングシステムが最大4GBのRAMに制限されている理由について詳しくは、https ://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-をご覧ください。 is-limited-to-4gb-of-ram

于 2016-06-09T12:30:36.947 に答える
24

これはここにあります:

s = raw_input()
a=len(s)
for i in xrange(0, a):
    for j in xrange(0, a):
        if j >= i:
            if len(s[i:j+1]) > 0:
                sub_strings.append(s[i:j+1])

大きな文字列には非常に非効率的で高価なようです。

やるほうがいい

for i in xrange(0, a):
    for j in xrange(i, a): # ensures that j >= i, no test required
        part = buffer(s, i, j+1-i) # don't duplicate data
        if len(part) > 0:
            sub_Strings.append(part)

バッファオブジェクトは、元の文字列と開始属性および長さ属性への参照を保持します。このようにして、データの不要な重複は発生しません。

長さの文字列には平均長のサブ文字列があるlため、メモリ消費量はおおよそ。になります。バッファを使用すると、はるかに小さくなります。l*l/2l/2l*l*l/4

buffer()2.xにのみ存在することに注意してください。3.xにはmemoryview()、わずかに異なる方法で使用されるがあります。

さらに良いのは、インデックスを計算し、必要に応じて部分文字列を切り出すことです。

于 2012-07-01T18:34:27.093 に答える
13

メモリエラーは、プログラムのメモリが不足していることを意味します。これは、プログラムがどういうわけかあまりにも多くのオブジェクトを作成することを意味します。

あなたの例では、大量のメモリを消費する可能性のあるアルゴリズムの部分を探す必要があります。あなたのプログラムは入力として非常に長い文字列を与えられているのではないかと思います。したがって、s[i:j+1]新しいリストが作成されるため、原因である可能性があります。ただし、初めて使用する場合は、作成したリストを使用しないため、必要ありません。次のことが役立つかどうかを確認してみてください。

if  j + 1 < a:
    sub_strings.append(s[i:j+1])

2番目のリストの作成を置き換えるには、 glglglで提案されているように、必ずバッファオブジェクトを使用する必要があります。

また、を使用するため、0if j >= i:から開始する必要はありません。次のようにするxrangeことができます。

for i in xrange(0, a):
    for j in xrange(i, a):
        # No need for if j >= i

より根本的な代替策は、考えられるすべてのサブ文字列を事前に計算しないように、アルゴリズムを作り直そうとすることです。代わりに、要求された部分文字列を単純に計算できます。

于 2012-07-01T15:59:41.807 に答える
4

コードにエラーがあるか、メモリが不足している場合は、コードをアップグレードするか、迅速な解決策として仮想メモリを増やしてみてください。

  1. マイコンピュータを開く
  2. 右クリックして[プロパティ]を選択します
  3. [システムの詳細設定]に移動します
  4. [アドバンス]タブをクリックします
  5. [パフォーマンス]の下の[設定]をクリックします
  6. [アドバンス]タブの[変更]をクリックします
  7. メモリサイズを増やすと、仮想メモリサイズが増えます。
于 2020-08-25T20:10:51.857 に答える
2

そのエラーをポップアップするのと同じスクリプトを作成して、外部スクリプトからインポートすることにより、スクリプトをいくつかのスクリプトに分割することができます。たとえば、hello.pyはエラーメモリエラーを予期しているので、hello.pyをいくつかのスクリプトに分割します。h.pye.py ll.py o.pyそれらはすべて、フォルダ「hellohello」に入る必要があります。 py into init write import h、e、ll、o次に、ideにimporthellohelloと書き込みます。

于 2014-08-15T21:51:16.723 に答える
-1

この入力でプログラムを確認してください:abc / ab ac bcのようなものを入手した場合abcプログラムはうまく機能し、より強力なRAMが必要です。そうでない場合、プログラムは間違っています。

于 2020-06-24T14:46:45.880 に答える
-5

Python 64ビットを使用すると、多くの問題が解決します。

于 2015-06-25T05:06:12.920 に答える