我正在使用Table Wizard + Migrate模块将节点导入我的Drupal安装。
我需要导入大约60,000个问题/答案(它们都是节点),我认为这将是一件容易的事。
但是,迁移过程每分钟导入4个节点,完成导入大约需要11天。
我想知道我是否可以通过直接导入mysql来加快速度。但实际上我需要创建60,000个节点。我猜Drupal会在其他表中存储其他信息......并且它不安全。
你建议我做什么?等10天? 感谢答案 0 :(得分:7)
表迁移应该比这快几个数量级。
你在使用pathauto吗?
如果是,请尝试禁用pathauto模块,导致导入时出现严重的性能问题。
其次,如果禁用pathauto不起作用,请关闭所有可能运行的非必要模块 - 某些模块会做疯狂的事情。消除其他模块作为问题的根源。
第三,是否启用了MySQL db log?这可能会产生很大的性能影响 - 不是你所说的水平,而是需要考虑的因素。
第三,安装xdebug,然后拖尾你的mysql日志,看看到底发生了什么。
你的PHP内存限制是多少?
你还有足够的磁盘空间吗?
答案 1 :(得分:1)
如果你不这样做,你应该使用drush批量迁移节点。如果你想让它自动化,你甚至可以为它编写一个shell脚本。使用命令行可以减少导入节点所需的时间。使用脚本,您可以将其作为自动化任务,而不必担心。
我想注意的一件事是,每分钟4个节点非常低。我曾经需要从CSV文件导入一些节点,使用迁移等。我需要导入300个节点,位置,4-5个CCK字段,我在几秒钟内就完成了。因此,如果您每分钟仅导入4个节点,则要么节点非常复杂,要么发生了一些可疑的事情。
您使用的计算机有哪些规格?进口来源在哪里?
答案 2 :(得分:1)
这是一个棘手的话题,但在Drupal中实际上非常好。我不知道这些故事。但要知道在哪里看。
答案 3 :(得分:0)
每分钟4个节点非常慢。迁移通常不应该花那么长时间。使用Drush可以加快速度,但可能不足以获得合理的导入时间(小时,而不是几天)。这无法真正解决您的核心问题:您的导入本身需要太长时间。迁移GUI的开销并不大。
直接导入MySQL肯定会更快,但是存在迁移的原因。 Drupal中的节点数据库存储很复杂,因此通常最好让Drupal解决这个问题而不是试图弄清楚究竟是什么。
您是否正在使用Migrate的钩子在每个节点上执行其他处理?我建议添加一些日志记录,看看究竟花了多长时间。一次在10个节点上进行测试,直到你在完成整个60k之前找出滞后。
答案 4 :(得分:0)
我们在Drupal 7安装上遇到了类似的问题。左边它在导入时全周运行,它只导入了1000行文件。
有趣的是,完全预生产机器上的相同导入需要90分钟。
我们最终比较了源代码(确保我们在git中的同一个提交),数据库模式(相同),每台机器上的节点数量(不相同但相似)......
长话短说,两台机器之间唯一重要的区别是max_execution_time
设置文件中的php.ini
选项。
生产机器有max_execution_time = 30
,而预生产机器有max_execution_time = 3000
。看起来迁移模块有一种系统来处理“短”max_execution_time
,它不是最佳的。
结论:在max_execution_time = 3000
中设置php.ini
或更多,这对迁移模块有很大帮助。
答案 5 :(得分:0)
我只是想添加一个说明,说pathauto禁用确实有帮助。我有一个超过22k行的导入,在禁用它之前花了12个多小时,并且在导入过程中会多次崩溃。禁用pathauto然后运行导入后,只花了62分钟而且没有崩溃一次。
简单地说,我创建了一个模块,在导入开始之前,禁用pathauto模块,然后在完成Feed后,重新启用pathauto模块。以下是模块中的代码,以防任何人需要具备此功能:
function YOURMODULENAME_feeds_before_import(FeedsSource $source) {
$modules = array('pathauto');
drupal_set_message(t('The ').$modules[0].t(' has been deployed and should begin to disable'), 'warning');
module_disable($modules);
drupal_set_message(t('The ').$modules[0].t(' module should have been disabled'), 'warning');
}
function YOURMODULENAME_feeds_after_import(FeedsSource $source) {
$modules = array('pathauto');
module_enable($modules);
drupal_set_message($modules[0].t(' should be reenabled now'), 'warning');
}