3

I'm writing a very simple script that reads a fairly large file (3M lines, 1.1G file) that contains litteral (str) expression of polynomial. I then use Sympy for some symbolic calculation and write results to 16 separate files.

My script, as it runs, takes an increasing memory space (> 20 Gb), and I can't understand why. Would you see any way to improve the memory usage of that script ?

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

这样,它每行读取文件本身,而不是存储在内存中的文件的副本。

希望这可以帮助!

于 2013-11-05T10:38:52.010 回答
0

我今天有同样的问题!在我的情况下,缓存不会真正带来任何好处,因为我知道我的代码不会从缓存中受益(sympy 在拟合函数中使用,并且每次迭代参数都会不同)。

所以我想完全禁用缓存,事实证明这是可能的:有一个环境变量:SYMPY_USE_CACHE. 如果设置为yes缓存,则启用,如果设置为no,则完全禁用。

所以我只是补充说:

export SYMPY_USE_CACHE=no
于 2014-06-09T21:23:56.753 回答