PHP + pthreads:构建一个大对象 - 并行处理

时间:2015-06-20 12:50:05

标签: php multithreading performance parallel-processing pthreads

最近我在我的php应用程序中遇到了一些严重的性能问题,它试图用超过一万行CSV数据做一些事情。 基本上我有大约十个函数,它们由不同的preg_match / preg_replace动作组成,它们处理解析的csv数据的每一行的一列(NLP DateParser,各种字符串修改的东西,来自html源的图像识别等)。

因为我到达的地方处理脚本的速度非常慢(在50到120秒之间),因为内存问题(太复杂的对象)现在需要一些性能改进;)

所以我来了pthreads,它允许在php脚本中进行多线程处理。但我不确定这是否有助于我的情况或只是产生比解决的更多性能问题(通过线程处理的开销):

我的想法是遍历所有一万行并为每个列处理步骤启动一个线程(10k行+10列= 10k * 10 = 100.000个线程)。您认为这会带来性能提升吗? 或者我应该将csv-data拆分为块(假设200行),这些块将在单独的线程中处理(10k行/ 200块= 50个线程)?

我会附上一张包含我的配置文件的PHP脚本的图片,你可以看到哪些功能耗费了很多时间,但遗憾的是我没有足够的声望点:/

并行处理有可能吗?我可以直接从不同的线程向同一对象添加属性,还是必须先同步(因此等待线程完成)?是否可以在多个线程中读取相同的文件(第一个hunderd行的线程1,线程2中的第二个,等等),并在所有处理步骤结束时构建一个包含所有行的大对象?

我希望我糟糕的英语不会妨碍你理解我的想法和问题......

感谢您的建议!

mfuesslin

编辑:我不确定瓶颈:猜测最大的一个是处理所有csv数据导致的大对象... Profiler让我注意到一些冗余的foreach循环我能够省略。 但主要问题是我必须处理的数据量。所有处理功能都不需要那么多时间(但如果你连续处理10k ......)。

使用内存数据库而不是csv进行操作的想法很不错 - 会尝试一下。

preg_ *函数不能被str_ *函数替换,因为我需要模式识别。

我还将尝试使用Gearman并尝试将各个数据处理步骤分开。

PHP版本是5.6.10,启用了opcache。

1 个答案:

答案 0 :(得分:2)

听起来你想拔出一把非常大的枪。我不确定,pthreads会解决所有问题。我不会详细介绍如何应用pthreads,因为这里有很多事情,似乎现有解决方案仍有一些改进空间。

  • 瓶颈究竟在哪里?您是否对代码进行了分析并解决了瓶颈问题?
  • CSV
    • 也许你可以删除它并将CSV数据导入Db?
    • 例如,如何使用SQLite内存中的Db进行处理
    • 您是通过使用chunked-parsing来降低CSV解析器的内存占用量吗?
  • 您正在使用preg_*()函数:尝试使用字符串函数替换它们
  • 将您的数据处理功能拆分为明确定义的单个作业
  • 使用作业/队列系统进行处理,例如
  • 你的PHP怎么样?升级到5.6?启用了opcache吗?
相关问题