- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Django adaptors上传一个简单的 CSV。当我导入 100 或 200 个联系人时,它似乎工作得很好。但是当我尝试上传一个包含 5000 个联系人的 165kb 文件时,它永远无法完成。我让它继续尝试,1 小时后我回来时它还在尝试。
这是怎么回事?使用 Django adaptors 导入一个 165kb 的文件不可能花费一个多小时。 . 代码有问题吗?
def process(self):
self.date_start_processing = timezone.now()
try:
# Try and import CSV
ContactCSVModel.import_data(data=self.filepath, extra_fields=[
{'value': self.group_id, 'position': 5},
{'value': self.uploaded_by.id, 'position': 6}])
self._mark_processed(self.num_records)
except Exception as e:
self._mark_failed(unicode(e))
CsvModel
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
update = {'keys': ["mobile", "group"]}
最佳答案
将较大的任务拆分成较小的部分。
第 1 步 - 只需读取 CSV 文件
ContactCSVModel.import_from_filename() 和 ContactCSVModel.import_from_file() 都返回 csv 行。禁用与 Django 模型的交互以跳过与数据库的交互。这应该会大大加快任务速度并打印导入的数据。这绝对有效!
CSV模型
class ContactCSVModel(CsvModel):
first_name = CharField()
last_name = CharField()
company = CharField()
mobile = CharField()
group = DjangoModelField(Group)
contact_owner = DjangoModelField(User)
class Meta:
delimiter = "^"
你的代码
def process(self):
self.date_start_processing = timezone.now()
try:
# Try and import CSV
lines = ContactCSVModel.import_data(data=self.filepath, extra_fields=[
{'value': self.group_id, 'position': 5},
{'value': self.uploaded_by.id, 'position': 6}])
print lines # or use logging
self._mark_processed(self.num_records)
except Exception as e:
self._mark_failed(unicode(e))
第 2 步 - 启用 django 模型交互但禁用检查数据库中的现有项目。
禁用它,因为启用此功能会查询数据库中 CSV 中的每一行,以根据您的自然键规范检查现有项目(我已阅读源代码)。您可能知道 CSV 中的所有行都是唯一联系人。
如果您的问题是整个导入过程中数据库查询缓慢,这将有所帮助,但如果导入消耗过多内存,则无济于事。
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
第 3 步 - 导入大小相同的 CSV block
使用 CSVModel 并启用与 Contact 模型的交互,但为 ContactCSVModel.import_data() 提供更小的迭代。我将其设置为 500。根据您的需要进行更改。下面的代码示例 ( link ) 可以帮助您理解。您需要对其进行一些更改以将其放入现有代码中。如果内存消耗是问题所在,这会有所帮助。
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}])
第 4 步 - 针对大内存消耗和缓慢运行
因为 django-adaptors 在导入期间将所有 Contact 模型实例保存在内存中,并且由于多次提交而不是批量插入操作导致操作缓慢 - 它不太适合较大的文件。
你有点依赖于 django 适配器。如果你依赖这个 django 包,你不能切换到批量插入。在 linux 下使用 top 或 htop 检查内存消耗,在 windows 上使用任务管理器。如果进程消耗太多并且操作系统开始交换,请切换到另一个具有更高效内存消耗和批量插入选项的 django 附加组件 - 有很多用于 csv 导入。
另一个提示是使用 csv 模块进行阅读,并使用您的 django 模型知识与数据库进行交互。这对您来说并不是一个真正的挑战 - 只需将其与您的大局中的孤立任务一起尝试,如果它们有效,则将它们放在一起 - 祝您好运。
关于python - Django 适配器 CSV 需要数小时才能导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004844/
我有 3 个 AutoCompleteTextView,我想在它们上面注册 2 个 String[] 适配器。目前,我正在这样做: atw_from.setAdapter(new ArrayAdapt
我需要实现一个 recyclerView 来显示我对 Parse 的查询,所以我已经做到了: private class Pagination extends RecyclerView.OnScro
我对 BizTalk 相当陌生,目前我只是探索它的功能并了解不同部分(架构、编排、端口等)如何协同工作。我对其适配器有疑问: 不同的适配器是否已经随 BizTalk 服务器安装一起预装并准备好配置,或
我在 BizTalk 中测试 MQSC 适配器以与 Z/OS 主机上的队列通信时遇到问题。 测试场景:通过 Biztalk 发送消息时,我(强制)停止并启动主机 channel ,以模拟主机 IPL。
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想用我的音频单元在iPhone上录制一条音频信号,该信号来自一条普通的3.5毫米音频电缆(例如,另一部iPhone作为声源)。 由于iPhone具有4端口耳机插孔,因此无法直接插入。 我尝试了不同种
[请参阅下面的更新] 我很难定义模式。我的同事说这是适配器模式。我不知道。我们陷入困境主要是因为我们想要正确命名我们的组件。 问题:是适配器模式吗?如果不是的话是什么?如果是其他事情,这是实现这个想法
我有点不熟悉Java KeyAdapter有效,并且使用 KeyAdapter 使用以下代码得到了意想不到的结果。当按下一个键而另一个键已按下时,就会出现此问题,无论 isKeyPressed() 是
我想知道如何通过 ORM 适配器使用 Node.js 在 MySQL 中创建多个表。我通过模型创建了一个表,即“us.js” module.exports = { identity: 'us'
我有一个 JavaFx 客户端。我正在使用一个具有 ObservableSet 作为字段的 bean 作为模型。我想将这些数据显示到 ListView 中,但我无法将我的字段类型更改为 Observa
我正在尝试在 native iOS 应用程序中实现基于表单的身份验证,但我需要在没有收到质询的情况下登录,我想打开一个表单并登录。我实现了一个包含 isCustomResponse 函数的 Chall
我正在尝试为我的迭代器和 const_iterator 类实现反向迭代器适配器,但遇到了一些麻烦。如果有人可以指导我解决这个问题,将不胜感激! 我的想法是我应该能够从我的 rbegin() 和 ren
使用 spring-integration-sftp,创建任意数量的入站 channel 适配器对象的推荐方法是什么?我的应用程序需要监视多个远程目录(1 到 n),直到运行时才知道。 最佳答案 当前
我正在尝试为我们自己的框架创建适配器。我们的框架使用自己的断言机制,因此我需要编写适配器。 适配器类非常简单,如下所示: public class AllureReportListener {
有没有什么方法可以使用命令行而不是使用 Worklight 控制台来部署 Worklight 适配器? (因为我的 worklight 服务器安装在 WAS 上,wsadmin 命令或类似的命令...
我想构建自己的自定义 log4j(网络)适配器来解决我的问题 that I posted here. 我查看了 log4j 的文档,但看不到开发人员在哪里/是否讨论如何执行此操作。 有人能给我指出正确
我使用消息驱动 channel 适配器从 weblogic JMS 队列接收作为字符串的 xml 消息,然后将此消息传递到 spring 集成 channel 以存储到数据库中,转换为不同的 xml,
有没有什么方法可以使用命令行而不是使用 Worklight 控制台来部署 Worklight 适配器? (因为我的 worklight 服务器安装在 WAS 上,wsadmin 命令或类似的命令...
我试图为 Android 制作一个聊天应用程序,所以我使用了 RecyclerView 。我的适配器有问题,我的聊天室收到的 JSON 响应显示为空白。我的代码是否遗漏了某些内容? 这是我的适配器类
如果这是重复的,我提前道歉。我对 Android 开发还是新手,并尝试寻找解决方案,但找不到有效的解决方案。 我正在创建一个待办事项应用程序并在我的适配器中收到此错误。 java.lang.NullP
我是一名优秀的程序员,十分优秀!