相关疑难解决方法(0)

当我在for循环中加载大型pickle文件时,如何防止内存泄漏?

我有50个每个0.5 GB的pickle文件.每个pickle文件都包含一个自定义类对象列表.我可以使用以下功能单独加载文件:

def loadPickle(fp):
    with open(fp, 'rb') as fh:
        listOfObj = pickle.load(fh)
    return listOfObj
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试迭代加载文件时,我得到内存泄漏.

l = ['filepath1', 'filepath2', 'filepath3', 'filepath4']
for fp in l:
    x = loadPickle(fp)
    print( 'loaded {0}'.format(fp) )
Run Code Online (Sandbox Code Playgroud)

loaded filepath2打印前我的内存溢出.如何编写代码以保证在每次迭代期间只加载一个pickle?

关于SO的相关问题的答案建议使用weakref模块中定义的对象或使用模块的显式垃圾收集gc,但我很难理解如何将这些方法应用于我的特定用例.这是因为我对引用如何在引擎下工作的理解不足.

相关:Python垃圾收集

python garbage-collection memory-leaks pickle python-3.x

11
推荐指数
1
解决办法
2951
查看次数

使用BeautifulSoup的Python高内存使用率

我试图在python 2.7.3中使用BeautifulSoup4处理几个网页但是在每次解析之后内存使用量都会上升.

此简化代码产生相同的行为:

from bs4 import BeautifulSoup

def parse():
    f = open("index.html", "r")
    page = BeautifulSoup(f.read(), "lxml")
    f.close()

while True:
    parse()
    raw_input()
Run Code Online (Sandbox Code Playgroud)

在调用parse()五次后,python进程已经使用了30 MB的内存(使用的HTML文件大约是100 kB),每次调用时它都会增加4 MB.有没有办法释放内存或某种解决方法?

更新: 这种行为让我很头疼.即使应该长时间删除BeautifulSoup变量,此代码也会轻松占用大量内存:

from bs4 import BeautifulSoup
import threading, httplib, gc

class pageThread(threading.Thread):
    def run(self):
        con = httplib.HTTPConnection("stackoverflow.com")
        con.request("GET", "/")
        res = con.getresponse()
        if res.status == 200:
            page = BeautifulSoup(res.read(), "lxml")
        con.close()

def load():
    t = list()
    for i in range(5):
        t.append(pageThread())
        t[i].start()
    for thread in t:
        thread.join()

while not raw_input("load? "):
    gc.collect()
    load()
Run Code Online (Sandbox Code Playgroud)

这可能是某种错误吗?

python memory beautifulsoup

9
推荐指数
3
解决办法
6073
查看次数

删除链表中的节点 - 是否需要任何形式的垃圾收集?

[Python 3.8]

删除链表中的next节点时,是否可以简单地更改节点?

在这里,我们“删除”节点 1,只需更改指针即可。

来自 C++ 世界,这让我有点紧张。由于没有对节点 1 的引用,节点 1 的内存会自动回收吗?节点 1 到底发生了什么?

[Sentinel] -> [Node 0] -> [Node 1] -> [Node 2] -> [Node 3] -> None
Run Code Online (Sandbox Code Playgroud)

[Sentinel] -> [Node 0] -? [Node 1] -?-> [Node 2] -> [Node 3] -> None
                        ?-----------?
Run Code Online (Sandbox Code Playgroud)

这是合法的吗?

最小的、完整的、可验证的例子

def delete(self, val):
    n = self.sentinel
    while n.next != None:
        if n.next.data == val:
            n.next = n.next.next  # reassign pointer - no del, free, delete, or the like.
            return …
Run Code Online (Sandbox Code Playgroud)

python linked-list python-3.x

3
推荐指数
1
解决办法
196
查看次数

删除对象时无法调用 __dealloc__

我有以下 C++ 类:

。H

class ALabSet: public LabSet {
public:
    PyObject *m_obj;

    ALabSet(PyObject *obj);

    virtual ~ALabSet();

    PyObject *GetPyObj();

};
Run Code Online (Sandbox Code Playgroud)

.CPP

ALabSet::ALabSet(PyObject *obj): LabSet() {

    this->m_obj = obj;
    // Provided by "cyelp_api.h"
    if (import_cyelp()) {
    } else {
        Py_XINCREF(this->m_obj);
    }

}


ALabSet::~ALabSet() {
    Py_XDECREF(this->m_obj);
}


PyObject *ALabSet::GetPyObj() {
    return this->m_obj;
}
Run Code Online (Sandbox Code Playgroud)

我用 Cython 将其暴露如下:

cdef extern from "adapter/ALabSiteSetsManager.h" namespace "elps" :
    cdef cppclass ALabSet:
        ALabSet(PyObject *)

        PyObject *GetPyObj()



cdef class PyLabSet:
    cdef ALabSet *thisptr

    def __cinit__(self):
       self.thisptr = new ALabSet(<PyObject *>self) …
Run Code Online (Sandbox Code Playgroud)

c++ python destructor cython

2
推荐指数
1
解决办法
2413
查看次数