Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP+;pthreads:构建一个大对象-并行处理_Php_Multithreading_Performance_Parallel Processing_Pthreads - Fatal编程技术网

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

PHP+;pthreads:构建一个大对象-并行处理,php,multithreading,performance,parallel-processing,pthreads,Php,Multithreading,Performance,Parallel Processing,Pthreads,最近,我在我的php应用程序中遇到了一些严重的性能问题,该应用程序试图处理超过一万行的CSV数据。 基本上,我有大约十个函数,由不同的preg_match/preg_replace操作组成,这些操作处理每行解析的csv数据中的一列(NLP DateParser、各种字符串修改内容、html源的图像识别等) 因为我所处的领域脚本的处理速度非常慢(在50到120秒之间),而且内存问题(太复杂的对象)现在是提高性能的时候了;) 所以我介绍了pthreads,它允许在php脚本中使用多线程。但我不确定这

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

因为我所处的领域脚本的处理速度非常慢(在50到120秒之间),而且内存问题(太复杂的对象)现在是提高性能的时候了;)

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

我的想法是遍历所有一万行,并为每个列处理步骤启动一个线程(10k行+10列=10k*10=100.000个线程)。您认为这会导致性能改进吗? 或者我应该将csv数据分割成块(比如说200行),这些块将在单独的线程中处理(10k行/200块=50个线程)

我会附上一张由我的php脚本组成的图片,在这里你可以看到哪些函数花费了很多时间,但遗憾的是我没有足够的信誉点:/

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

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

谢谢你的建议

姆弗斯林

编辑:我不确定瓶颈:猜测最大的瓶颈是处理所有csv数据产生的大对象的处理。。。探查器让我注意到了一些冗余的foreach循环,我可以将其删除。 但主要问题是我必须处理的数据量。所有处理函数不需要那么多时间(但如果您连续处理10k…)

使用内存中的db而不是csv进行操作的想法很好,我将尝试一下

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

我还将尝试Gearman,并尝试在单个作业中分离每个数据处理步骤


PHP版本是5.6.10,启用了opcache。

听起来你想拿出一把真正的大炮。我不确定pthreads是否能解决所有问题。我不会详细介绍如何应用pthreads,因为这里有很多事情要做,而且似乎在现有解决方案上还有一些改进的空间

  • 瓶颈在哪里?您是否分析了代码并处理了瓶颈
  • CSV
    • 也许你可以放下它,把CSV数据导入数据库
    • e、 例如,在内存数据库中使用SQLite进行处理怎么样
    • 您是否正在通过使用分块解析来降低CSV解析器的内存占用
  • 您正在使用
    preg_*()
    函数:尝试用字符串函数替换它们
  • 将数据处理功能拆分为明确定义的单个作业
  • 使用作业/队列系统进行处理,如
    • Gearman()
    • RabbitMQ()
  • 你的PHP呢?升级到5.6?opcache启用了吗

谢谢您的回答!我已经用一些附加信息编辑了我的帖子!一定会试试Gearman!很高兴我能帮上点忙。请考虑您可以在CLI上轻松地导入CSV到DB,然后与PHP中的DB一起工作。例如,使用Sqlite时:
.mode csv
+
.import C:/work/data.csv table1
;这将跳过PHP脚本的整个CSV解析步骤。