处理Python内存使用的可能修复

处理Python内存使用的可能修复,python,Python,我有以下课程: class C1: STORE = [] TYPE = [] ITEMS = [] PRICE = [] def __init__(self,STORE,TYPE,ITEMS,PRICE): self.STORE = STORE self.TYPE = TYPE self.ITEMS = ITEMS self.PRICE = PRICE 该类的目的是在不同的商店中存储所

我有以下课程:

 class C1:
    STORE = []
    TYPE = []
    ITEMS = []
    PRICE = []


    def __init__(self,STORE,TYPE,ITEMS,PRICE):
        self.STORE = STORE
        self.TYPE = TYPE
        self.ITEMS = ITEMS
        self.PRICE = PRICE
该类的目的是在不同的商店中存储所有商品及其价格。商品按字母数字顺序排列,如果商店中不存在该商品,则价格显示为0。我正在从数据库中的表中检索数据,如下所示:

           S1  S2  S3 .... S29000
item1      15   2  30 ....    100
item2       0   1   0 ....      5
.
.
.
item600     30 190 10 ....     25
相应地,存储和项目列表如下所示:

商店:['S1','S2',…,'S29000'] 项目:['item1'、'item2'、..、'item600']

对于价目表,它是一个多维列表,通过指定门店索引和商品索引,它将为您提供指定门店指定商品的价格(例如,价格[0][0]将为您提供S1的商品1的价格,即15)

所有这些数据都在一个类中,我运行“报告”,其中包含一些“复杂”的计算

我遇到的问题是,我从不同的表创建类对象,根据Windows任务管理器,python的内存使用率几乎达到1.8GB

我知道我的对象是内存消耗的主要原因,这给我带来了两个问题:

  • 在使用它们和gc之后,我“删除”了每个类对象,而且python似乎不想在脚本完成之后释放内存。有没有蛮力的方法来释放它

  • 除了列表之外,是否还有其他数据结构会消耗更少的内存并提高我的性能?我注意到Numpy是一个选项,但我不得不使用Python2.3,它似乎与Numpy不兼容

  • 以前,每次我想计算一些东西时,我都会尝试读取数据库,这需要我的程序运行近3个小时,但现在将数据存储到类中需要40分钟。所以我的“客户”不想重蹈覆辙

    提前谢谢

    编辑:原始数据看起来像我前面描述的表,但它只能通过供应商提供的API访问

    EDIT2:我的目的是为多个“数据源”创建各种C1类型的对象。因此,我最终会得到6个C1类型的对象,每个对象中都包含不同的数据

    EDIT3:为了访问每个商店的商品价格列表,API有一个函数,其形式为GetPrices(“商店名称”)。因此,有必要为每个商店调用此函数。因此,目前,我生成C1对象的代码有一个巨大的For循环,它为每个存储调用这个函数

    项目按字母数字顺序排列[…]

    所有这些数据都在一个类中,我运行“报告”,其中包含一些“复杂”的计算

    除了列表之外,是否还有其他数据结构会消耗更少的内存并提高我的性能

    我只是在猜测你的算法:线性时间搜索?如果是这样的话,使用可以大大提高性能

    但这并不能解决内存问题;考虑使用一个适当的数据库包,例如+或普通的B-树。 项目按字母数字顺序排列[…]

    所有这些数据都在一个类中,我运行“报告”,其中包含一些“复杂”的计算

    除了列表之外,是否还有其他数据结构会消耗更少的内存并提高我的性能

    我只是在猜测你的算法:线性时间搜索?如果是这样的话,使用可以大大提高性能


    但这并不能解决内存问题;考虑使用一个适当的数据库包,例如+或普通的B-树。

    < P>你可以尝试<代码>数组< /C>模块,它在Python 2.3中。除此之外,您可能还需要研究如何为这些内容使用合适的数据库。

    您可以尝试使用
    array
    模块,它在Python2.3中已经存在。除此之外,您可能还需要研究如何为这些内容使用合适的数据库。

    在不了解更多算法的情况下,很难说些什么,但可能是一种选择?还是细胞素?Pyrex?

    在不了解更多算法的情况下很难说些什么,但也许会是一种选择?还是细胞素?Pyrex?

    您有一个800 x 30000矩阵。即每个阵列有2400000个元素。如果它们是浮动的,那么已经有大约100MB的空间了,但由于对象开销,空间会更大。你有六只这样的野兽

    如果1.8GB太大,则必须存储更少的数据。对不起,这就是为什么真正的数字运算会很困难。确保你只拥有你需要的数据,就这样


    如果该矩阵的大部分是空的,那么我建议查看一些稀疏矩阵库。SciPy/NumPy是最常见的,但我相信其他人也提供了一些可以使用python2.3的东西。也许是一个老NumPy?

    你有一个800 x 30000的矩阵。即每个阵列有2400000个元素。如果它们是浮动的,那么已经有大约100MB的空间了,但由于对象开销,空间会更大。你有六只这样的野兽

    如果1.8GB太大,则必须存储更少的数据。对不起,这就是为什么真正的数字运算会很困难。确保你只拥有你需要的数据,就这样


    如果该矩阵的大部分是空的,那么我建议查看一些稀疏矩阵库。SciPy/NumPy是最常见的,但我相信其他人也提供了一些可以使用python2.3的东西。也许是一个旧的NumPy?

    使用Python 2.3会限制您的选择(包括排除使用64位的选项)。这也是内存没有被释放回操作系统的主要原因:CPython中的内部对象分配器在之前无法将不再使用的内存返回到操作系统

    如果可以,试着在2.7上运行该算法,看看纯粹使用最新版本的解释器可以获得什么好处(或者在这种迁移中会出现什么兼容性问题)

    而且,正如其他人所建议的,优化您的数据结构。检查您执行的操作的算法复杂性