我的python应用程序从文件中读取数据,并在启动过程中将这些数据存储在字典中(字典是数据读取器类的属性)。一旦应用程序启动并使用了读取的数据,就不再需要字典中的这些数据。但是,它们消耗大量内存。如何删除这些词典以释放内存?
例如:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->SMTPSecure = 'ssl';
$mail->SMTPDebug = 2;
$mail->isSMTP();
$mail->Host = 'smtpgateway.webhost.com';
$mail->SMTPAuth = false;
$mail->SMTPSecure = false;
$mail->port = 25;
$mail->setFrom('info@mydomain.com', 'Test');
$mail->Subject = $email_subject;
$mail->Body = $email_body;
$mail->addAddress($email, $name);
$mail->isHTML(true);
if($mail->send())
{
echo "Success";
}
启动应用程序后,不再需要class DataReader():
def __init__(self, data_file):
self.data_file = data_file
def read_data_file_and_store_data_in_dictionary():
self.data_dictionary = {}
for [data_name, data] in self.data_file:
self.data_dictionary[data_name] = data
class Application():
def __init__(self, data_file):
self.data_reader = DataReader()
self.data_reader.read()
def start_app(self):
self.use_read_data()
。如何永久删除self.data_dictionary
?
答案 0 :(得分:2)
使用__attribute__ ((interrupt ("IRQ")))
语句
del
请注意,这只会删除该引用到字典。如果字典还存在其他引用(例如,您已经完成del self.data_dictionary # or del obj.data_dictionary
和d = data_reader.data_dictionary
仍然引用d
),则该字典将不会从内存中释放出来。这还包括对data_dictionary
的所有引用。
只有删除所有引用后,该词典才最终被释放。
答案 1 :(得分:2)
使用Python,您不必关心内存管理。
Python具有出色的garbage collector,它为每个对象计算代码中的引用。
如果没有引用,则将取消分配对象。
在您的情况下,如果使用完内存后内存仍然不空闲,则意味着该对象仍可以在程序中使用。如果您删除它然后尝试调用它,则会得到一个ReferenceError
。
有人在其他答案中建议使用del
,但只会删除变量名。
我的建议是确保您的代码不再实际调用该对象,如果可以,则相应地操作您的数据(使用lightweight db,将其保存在本地硬盘上,...)并检索他们在需要的时候。如果您的大词典是仍在使用的类的类参数,但不再需要该字典,则应将这些字典带到该类之外(也许引用一个仅用于管理该字典的新类)。在this Q&A中,您将找到优化内存使用的有用提示。
您可以阅读this article,深入了解Python的垃圾收集器
答案 2 :(得分:1)
将数据放在较小范围内如何?
class Application():
def __init__(self, data_file):
self.use_read_data(DataReader(data_file).read())
启动应用程序后,不再需要self.data_dictionary
如果在应用程序的整个生命周期中都不需要数据,则不应将其存储在实例属性中。
选择合适的作用域,您无需担心删除变量。
答案 3 :(得分:0)
del
将删除对该对象的引用,但是它仍然可以在内存中。在这种情况下,垃圾收集器(gc.collect([generation])
)将释放内存:
https://docs.python.org/2.7/library/gc.html
import gc
[...]
# Delete reference
del object
# Garbage collector
gc.collect()
[...]