<p>把你的大任务分成小块。在</p>
<p><strong>第1步-读取CSV文件</strong></p>
<p>两者兼而有之ContactCSVModel.import_from_文件名()和ContactCSVModel.import_from_文件()返回csv行。禁用与django模型的交互以跳过与数据库的交互。这将大大加快任务的速度并打印导入的数据。这肯定有用!在</p>
<p>CSV模型</p>
<pre><code>class ContactCSVModel(CsvModel):
first_name = CharField()
last_name = CharField()
company = CharField()
mobile = CharField()
group = DjangoModelField(Group)
contact_owner = DjangoModelField(User)
class Meta:
delimiter = "^"
</code></pre>
<p>你的代码</p>
^{pr2}$
<p><strong>第2步-启用django模型交互,但禁用检查数据库中的现有项。</strong></p>
<p>禁用它,因为启用此功能将根据您的自然键规范(我已经阅读了源代码)查询CSV中每一行的DB,以检查现有项。也许你知道CSV中的所有行都是唯一的联系人。在</p>
<p>如果您的问题是整个导入过程中的数据库查询速度慢,这将有所帮助,但如果导入消耗了太多内存,则不会有真正的帮助。在</p>
<pre><code>class ContactCSVModel(CsvModel):
first_name = CharField()
last_name = CharField()
company = CharField()
mobile = CharField()
group = DjangoModelField(Group)
contact_owner = DjangoModelField(User)
class Meta:
delimiter = "^"
dbModel = Contact
</code></pre>
<p><strong>第3步-导入大小相等的CSV块</strong></p>
<p>使用CSVModel并启用与联系人模型的交互,但为ContactCSVModel.import_数据(). 我把它设为500。根据你的需要改变它。下面的代码示例(<a href="https://stackoverflow.com/questions/4956984/how-do-you-split-a-csv-file-into-evenly-sized-chunks-in-python">link</a>)是为了让您明白这一点。您需要对其进行一些更改,以便将其放入现有代码中。如果这是内存消耗问题的话。在</p>
<pre><code>import csv
reader = csv.reader(open(self.filepath, 'rb'))
def gen_chunks(reader, chunksize=100):
"""
Chunk generator. Take a CSV `reader` and yield
`chunksize` sized slices.
"""
chunk = []
for i, line in enumerate(reader):
if (i % chunksize == 0 and i > 0):
yield chunk
del chunk[:]
chunk.append(line)
yield chunk
for chunk in gen_chunks(reader, chunksize=500):
ContactCSVModel.import_data(data=chunk, extra_fields=[
{'value': self.group_id, 'position': 5},
{'value': self.uploaded_by.id, 'position': 6}])
</code></pre>
<p><strong>第4步-针对大内存消耗和慢操作</strong></p>
<p>由于django适配器在导入期间将所有联系人模型实例保存在内存中,并且由于多个单次提交而不是大容量插入操作,django适配器的操作速度较慢,因此它不太适合较大的文件。在</p>
<p>你有点依赖django适配器。如果依赖这个django包,就不能切换到批量插入。使用top或htop在linux下使用task manager检查内存消耗。如果进程消耗太多,并且操作系统开始交换,那么切换到另一个django插件,可以选择使用更高效的内存消耗和大容量插入,其中有很多用于csv导入。在</p>
<p>另一个提示是使用csv模块进行读取,并使用django模型知识与数据库交互。这对你来说并不是一个真正的挑战-只要试着把你的大局中的一些孤立的任务放在一起,如果它们正在工作的话-祝你好运。在</p>