Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python(+django)在简单脚本中缺少垃圾收集_Python_Django_Model_Garbage Collection - Fatal编程技术网

Python(+django)在简单脚本中缺少垃圾收集

Python(+django)在简单脚本中缺少垃圾收集,python,django,model,garbage-collection,Python,Django,Model,Garbage Collection,所以我用python编写了这个脚本。 它使用来自django的模型来获得一些精确的信息:大量数据来自数据库 我想要实现的目标的快速“总结”可能并不重要,因此您也可以通过查看代码来获得它: 有一种类型的对象。 对于每个A对象,都有B类型1到多的相关对象。 对于每个B对象,都有C类型1到多的相关对象。 对于每个C对象,有一个相关的对象对我来说特别有趣——让我们称之为D 1对1关系 对于数据库中的每个A对象,我不需要获取和它相关的所有B对象和所有和它相关的D对象来创建对象的摘要。每个摘要都是一个单独的

所以我用python编写了这个脚本。 它使用来自django的模型来获得一些精确的信息:大量数据来自数据库

我想要实现的目标的快速“总结”可能并不重要,因此您也可以通过查看代码来获得它: 有一种类型的对象。 对于每个A对象,都有B类型1到多的相关对象。 对于每个B对象,都有C类型1到多的相关对象。 对于每个C对象,有一个相关的对象对我来说特别有趣——让我们称之为D 1对1关系

对于数据库中的每个A对象,我不需要获取和它相关的所有B对象和所有和它相关的D对象来创建对象的摘要。每个摘要都是一个单独的工作表,我正在使用openpyxl

我写的代码是有意义的:它做了我希望它做的事情,但是垃圾收集有问题,所以进程被终止。我尝试过不使用预取,因为时间不是很重要,但它并没有真正的帮助

摘要代码:

a_objects = A.objects.all()
wb = Workbook()

for a_object in a_objects:
    ws = wb.create_sheet()
    ws.title = a.name
    summary_dictionary = {}
    << 1 >>
    b_objects = B.objects.filter(a_object=a_object)

    for b_object in b_objects:
        c_objects = C.objects.filter(b_object=b_object)
        for c_object in c_objects:
            # Here i put a value in dictionary, or alter it, 
            # depending on whether c_object.d_object has unique fields for current a_object
            # Key is a tuple of 3 floats (taken from d_object)
            # Value is array of 3 small integers (between 0 and 100) 

    summary_dictionary = sorted(summary_dictionary.items(), key=operator.itemgetter(0))

    for summary_item in summary_dictionary:
        ws.append([summary_item[0][0], summary_item[0][1], summary_item[0][2], summary_item[1][0], summary_item[1][1], summary_item[1][2], sum(summary_item[1])])

wb.save("someFile.xlsx")
虽然从理论上讲,整个xlsx文件可能是巨大的——可能超过1GB,但如果所有的d_对象值都是唯一的,我估计即使在脚本末尾,它也会大大低于100MB。执行脚本时,系统中大约有650 MB的可用内存

大约有80个A对象,其中6个或7个对象之后脚本将被终止。我使用top来监控内存使用情况,但没有注意到任何内存被释放,这很奇怪,因为,比方说:第三个a_对象有1000个b_对象与其相关,每个b_对象有30个c_对象与其相关,第四个a_对象只有100个b_对象与其相关,每个b_对象只有2个c_对象与其相关

在第四次迭代后,应该释放大量内存,对吗? 我的观点是,我认为这个程序的行为应该是这样的,只要以下内容能够放入内存,它就会运行: -全部摘要 -数据库中任何a_对象的所有b_对象及其c_对象和d_对象的单个集合

那么我遗漏了什么?

尝试切换:

a_objects = A.objects.all()
致:


我将在明天试一试,对于其他对象b和c,因为a在这里是最不重要的,只有大约80个,我真的不明白它会有什么帮助。我知道迭代器会阻止缓存,但是当对queryset的引用被删除后,缓存的对象应该被垃圾收集,不是吗?
a_objects = A.objects.all().iterator()