|
|
1
3
你不会喜欢的,但是……听起来你在手头的任务中使用了错误的语言。如果你想在速度上有一些巨大的飞跃,那么下一步就是向编译语言提供一个端口。编译语言的运行速度比脚本语言快得多,所以您将看到处理时间的减少。 此外,您还可以使用内置命令将数据转储到数据库中。Postgres有一个(Dump?Load?类似的东西)可以读取一个以制表符分隔的文本文件,其中的列与表中的列匹配。这将允许您只关注以正确的格式获取文本文件,然后用一个命令将其放入数据库,并让它处理优化,而不是自己。
我们在一个.net应用程序中做了类似的事情,它每天早上在每一行上执行RegExp,通过咀嚼20Gb的文件,在内存中为唯一记录保留哈希,然后将新记录插入数据库。然后,我们使用Ruby脚本轻松地写出9000多个JS文件(这是最慢的部分)。我们以前也用Ruby编写导入程序,整个过程花了3个多小时,用.net重新编写整个过程大约需要30-40分钟,其中20分钟是缓慢的Ruby脚本(尽管它做得足够好,但不值得再优化)。 |
|
2
3
这类任务的两个重要设计建议:
如果您的mysql存储类型支持事务(表必须是InnoDB),则可以使用它们进行优化。启动事务并处理f.ex。100k行,然后通过提交事务并打开一个新事务来刷新。这是因为MySql只更新索引一次,而不是每行更新一次。
最后,如果其他方法都不起作用,您可以从等式中删除php并使用
|
|
|
3
2
您所花费的时间在不同的机器之间是相似的,可能是因为PHP脚本和MySQL服务器之间的通信:对于每个MySQL请求:
需要时间的可能并不真正在PHP方面;最有可能的是,它位于PHP和MySQL之间——对此您可能无能为力。 如果你有一台相当强大的机器,我建议你:
脚本的第一次并行执行将处理的数据减少6倍;其他人也一样。。。它们将并行工作。。。因此,最终,整个过程所需的时间可能会减少4倍:-) 这可能不会减少6倍的时间:使用并行化意味着在机器上增加一些负载,MySQL将有一些并发请求——但只要有几个并行进程,就可以了。 附带说明:从PHP执行此操作可能不是最好的事情。以下是我可以思考的另一种方式:
这样,只需确保文件中的SQL请求是正确的,然后MySQL一次导入所有内容:您不必为每个请求从PHP到MySQL,它应该运行得更快。 希望这有帮助,玩得开心! |
|
|
4
1
除了脚本的优化之外,您建议尝试任何PHP加速器(例如: eaccelerator.net )。如果这没有帮助,我建议使用专门为此类任务设计的语言/平台。 |
|
|
5
0
几乎所有其他答案都指出了这一点。PHP不太适合这种处理。 尤其是现在HADOOP等人已经基本上使这种特定类型的任务在云中完全并行化。 但是,某些地方的人可能需要像我一样使用PHP来处理大型文件。 有鉴于此,我应该指出,新的Facebook工具 xhprof 如果向其发送以下命令以启动:
您可以很容易地看到您自己的代码的特定部分花费了这么多时间。
-英尺 |