我正在运行一个转换脚本,它使用Django的ORM将大量数据提交到数据库。我使用手动提交来加速这个过程。我有数百个要提交的文件,每个文件将创建超过一百万个对象。
我正在使用Windows 7 64位。我注意到Python进程一直在增长,直到消耗超过800MB,这只适用于第一个文件!
脚本循环遍历文本文件中的记录,重用相同的变量而不累积任何列表或元组。
我读到here这是Python(也许是任何程序)的一般问题,但我希望Django或Python有一些明确的方法来减少进程大小......
以下是代码概述:
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
答案 0 :(得分:3)
首先,请确保您的settings.py中有DEBUG=False
。发送到数据库的所有查询都会在django.db.connection.queries
时存储在DEBUG=True
中。如果导入许多记录,这将变成大量内存。你可以通过shell检查它:
$ ./manage.py shell
> from django.conf import settings
> settings.DEBUG
True
> settings.DEBUG=False
> # django.db.connection.queries will now remain empty / []
如果这没有帮助,那么尝试生成一个新的Process来为每个文件运行process_file。这不是最有效的,但您试图将内存使用率降低而不是CPU周期。这样的事情应该让你开始:
from multiprocessing import Process
for filename in files_to_process:
p = Process(target=process_file, args=(filename,))
p.start()
p.join()
答案 1 :(得分:0)
很难说,我建议的是描述你的代码&看看代码的哪一部分导致内存激增。
在您知道代码的哪一部分占用内存后,您可以考虑减少它。
即使经过你的努力,内存消耗也没有下降,你可以这样做 - 因为进程以块(或页)和内容分配内存。在进程仍在运行时释放它们很困难,你可能会产生一个子进程,在那里执行所有内存密集型任务。将结果传递回父进程&死。这样,消耗的(子进程的)内存返回到OS&你的父流程保持精益......