【问题标题】:PHP preg_match_all 100 MB filePHP preg_match_all 100 MB 文件
【发布时间】:2012-07-04 04:16:31
【问题描述】:

我读过“preg_match_all”不是为解析大文件而设计的,但我需要这样做。我增加了:

pcre.backtrack_limit=1000000000
pcre.recursion_limit=1000000000

我的 PHP memory_limit 设置为 5000M,脚本仍然在 0.2 秒内结束,没有任何错误或异常...

唯一的解决办法是把100M的文件分成100个1M的小文件吗?

感谢您的帮助

【问题讨论】:

  • 你的代码是什么?它在大文件上应该可以正常工作,但它会占用大量内存。一个巨大的。
  • gist.github.com/3041137 太丑了.. 我知道... FOR, FOR, FOR ...
  • PS:我有 8GB RAM(5GB 免费)
  • 如果它很快就失败了,你可能只有一个parse error。打开 PHP 错误报告。此外,在分享您的代码时,您应该将其发布在上面的问题中,并妥善格式化。
  • 它的不解析错误......在一小块数据上它的工作......

标签: php regex file


【解决方案1】:

根据你的code我建议你这样做:

  1. 将变量$data设置为空字符串

  2. 将变量$work设置为空字符串;读取数据块并将此字符串附加到$data

  3. 使用正则表达式#^(.*?)(<tr>\n(?!.*<tr>\n).*)$#$data拆分为$work$data

  4. $work中查找所有匹配项

  5. 在数据可用时返回第 2 点

  6. $data中查找所有匹配项

【讨论】:

  • 2.有多大的数据块?如果我读取“data da”会怎样...第二个数据“da”将不会被处理..
  • @MarekJavůrek - 你可以用任何大小的块来做到这一点,它会起作用。关于您的示例问题 - 它将被分成两部分,第二部分将使用新的数据块进行处理(在第 #2 点中,它说 append 这意味着添加到现有数据块的末尾:@ 987654331@ 或 $data .= $new) - 只需编写代码并进行测试。
【解决方案2】:

考虑使用更适合处理大量数据的命令行工具。

grep、sed、awk 或它们的某种组合。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签