3

多項式のリテラル (str) 式を含むかなり大きなファイル (3M 行、1.1G ファイル) を読み取る非常に単純なスクリプトを作成しています。次に、シンボリック計算に Sympy を使用し、結果を 16 個の個別のファイルに書き込みます。

スクリプトを実行すると、使用するメモリ スペースが増加し (> 20 Gb)、その理由がわかりません。そのスクリプトのメモリ使用量を改善する方法はありますか?

from sympy import sympify
from sympy.abc import x,y
from sympy import degree

fin = open("out_poly","r")
A = fin.readlines()
fin.close()
deg = 4
fou = [open("coeff_x"+str(i)+"y"+str(k),"w") for i in range(deg+1) for k in range(deg+1-i)]

for line in A:
  expr = line.replace("^","**").replace("x0","x").replace("x1","y")
  exprsy = sympify(expr)
  cpt = 0
  for i in range(deg+1):
    for k in range(deg+1-i):
      fou[cpt].write(str(exprsy.coeff(x,i).coeff(y,k))+"\n")
      cpt = cpt+1

for files in fou:
  files.close()
4

3 に答える 3

6

それを見つけた!犯人は…シンピー!

Sympy は式をキャッシュし、メモリをいっぱいにします。この問題は、環境変数 SYMPY_NO_CACHE=no を設定することで解決できますが、Sympy のパフォーマンスに深刻な影響を与える可能性があります。より良い代替手段は、次の Sympy 拡張機能をインポートすることです。

from sympy.core.cache import *

適切な間隔でコード内のキャッシュをクリアします。

clear_cache()

私のコードの各反復でこれらのコマンドを使用すると、メモリ使用量は安定しており、わずか 26 Mo で一定です。

問題に関するリンク: http://code.google.com/p/sympy/issues/detail?id=3222

Sympy キャッシュに関するリンク: https://github.com/sympy/sympy/wiki/faq

ご協力ありがとうございます。

于 2013-11-06T09:23:49.987 に答える
4

finが大きすぎてバッファに格納できないことが原因である可能性があります。これらの行:

fin = open("out_poly","r")
A = fin.readlines()
fin.close()

の内容全体をメモリに保存するfinため、メモリ内で非常に多くのスペースを使用しています。

に保存する代わりにA、ファイル自体を直接ループできます。

from sympy import sympify
from sympy.abc import x,y
from sympy import degree

deg = 4
fou = [open("coeff_x"+str(i)+"y"+str(k),"w") for i in range(deg+1) for k in range(deg+1-i)]

with open("out_poly") as A:
    for line in A:
      expr = line.replace("^","**").replace("x0","x").replace("x1","y")
      exprsy = sympify(expr)
      cpt = 0
      for i in range(deg+1):
        for k in range(deg+1-i):
          fou[cpt].write(str(exprsy.coeff(x,i).coeff(y,k))+"\n")
          fou[cpt].close() #close it straight away, so we don't need to close it later
          cpt = cpt+1

これにより、メモリに保存されているファイルのコピーではなく、ファイル自体を 1 行ごとに読み取ります。

お役に立てれば!

于 2013-11-05T10:38:52.010 に答える
0

今日も同じ問題がありました!私の場合、コードがキャッシュの恩恵を受けないことを知っていたので、キャッシュは実際には何の恩恵ももたらしませんでした (適合関数内で sympy が使用され、反復ごとにパラメーターが異なります)。

したがって、キャッシュを完全に無効にしたかったのですが、それが可能であることがわかりました: 環境変数があります: SYMPY_USE_CACHE。キャッシュに設定するyesと有効になり、設定するnoと完全に無効になります。

だから私はちょうど追加しました:

export SYMPY_USE_CACHE=no
于 2014-06-09T21:23:56.753 に答える