我有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 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 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) 我有以下 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) python ×4
python-3.x ×2
c++ ×1
cython ×1
destructor ×1
linked-list ×1
memory ×1
memory-leaks ×1
pickle ×1