我正在运行一个转换脚本,使用Django的ORM提交大量的数据到数据库。 我使用手动提交来加快进程。 我有数百个文件来提交,每个文件将创build超过一百万个对象。
我正在使用Windows 7 64位。 我注意到Python进程持续增长,直到它消耗超过800MB,这只是第一个文件!
脚本在文本文件中循环logging,重复使用相同的variables,而不累积任何列表或元组。
我在这里读到,这是一个Python的一般问题(也许是任何程序),但我希望Django或Python有一些明确的方法来减less进程的大小…
以下是代码的概述:
import sys,os sys.path.append(r'D:\MyProject') os.environ['DJANGO_SETTINGS_MODULE']='my_project.settings' from django.core.management import setup_environ from convert_to_db import settings from convert_to_db.convert.models import Model1, Model2, Model3 setup_environ(settings) from django.db import transaction @transaction.commit_manually def process_file(filename): data_file = open(filename,'r') model1, created = Model1.objects.get_or_create([some condition]) if created: option.save() while 1: line = data_file.readline() if line == '': break if not(input_row_i%5000): transaction.commit() line = line[:-1] # remove \n elements = line.split(',') d0 = elements[0] d1 = elements[1] d2 = elements[2] model2, created = Model2.objects.get_or_create([some condition]) if created: option.save() model3 = Model3(d0=d0, d1=d1, d2=d2) model3 .save() data_file.close() transaction.commit() # Some code that calls process_file() per file
首先,在settings.py中确保DEBUG=False
。 当DEBUG=True
时,所有发送到数据库的查询都存储在django.db.connection.queries
。 如果您导入很多记录,这将变成大量的内存。 你可以通过shell来检查它:
$ ./manage.py shell > from django.conf import settings > settings.DEBUG True > settings.DEBUG=False > # django.db.connection.queries will now remain empty / []
如果这没有帮助,那么尝试产生一个新的进程来运行每个文件的process_file。 这不是最有效率的,但是你正试图保持内存使用量不是CPU周期。 像这样的东西应该让你开始:
from multiprocessing import Process for filename in files_to_process: p = Process(target=process_file, args=(filename,)) p.start() p.join()
很难说,我所建议的是分析你的代码,看看代码的哪一部分导致了这个内存的激增。
在知道哪部分代码占用内存后,可以考虑减少内存。
即使在你的努力后内存消耗不下来,你可以做到这一点 – 因为进程得到块(或页)的内存分配和释放他们,当进程仍在运行是困难的,你可以产卵一个子进程,做所有的内存在那里进行密集型任务,并将结果传回父进程并死亡。 这种方式消耗的内存(子进程)返回的操作系统和您的父进程保持精益…