使用php搜索非常大的文件以非常有效地提取块
发布时间:2020-12-13 17:12:31 所属栏目:PHP教程 来源:网络整理
导读:我最近一直在解析视频文件中的元数据,并且发现部分问题是视频制作软件供应商(以及其他原因)无视各种标准(或者至少是互动的差异). 因此,我需要能够扫描各种格式,容器和编解码器的非常大的视频(和图像)文件,并挖掘出元数据.我已经有FFMpeg,ExifTool Imagick和E
我最近一直在解析视频文件中的元数据,并且发现部分问题是视频制作软件供应商(以及其他原因)无视各种标准(或者至少是互动的差异).
因此,我需要能够扫描各种格式,容器和编解码器的非常大的视频(和图像)文件,并挖掘出元数据.我已经有FFMpeg,ExifTool Imagick和Exiv2各自处理各种文件类型的不同类型的元数据,并通过各种其他选项填补其他一些空白(请不要建议库或其他工具,我已经尝试了所有: )). 现在我要扫描一个XMP块(通常由Adobe套件和其他软件写入电影文件)扫描大文件(每个高达2GB).我已经写了一个功能,但我担心它可以改进. function extractBlockReverse($file,$searchStart,$searchEnd) { $handle = fopen($file,"r"); if($handle) { $startLen = strlen($searchStart); $endLen = strlen($searchEnd); for($pos = 0,$output = '',$length = 0,$finished = false,$target = ''; $length < 10000 && !$finished && fseek($handle,$pos,SEEK_END) !== -1; $pos--) { $currChar = fgetc($handle); if(!empty($output)) { $output = $currChar . $output; $length++; $target = $currChar . substr($target,$startLen - 1); $finished = ($target == $searchStart); } else { $target = $currChar . substr($target,$endLen - 1); if($target == $searchEnd) { $output = $target; $length = $length + $endLen; $target = ''; } } } fclose($handle); return $output; } else { throw new Exception('not found file'); } return false; } echo extractBlockReverse("very_large_video_file.mov",'<x:xmpmeta','</x:xmpmeta>'); 目前它还没问题,但我真的很想在这里充分利用php而不会削弱我的服务器,所以我想知道是否有更好的方法来做到这一点(或调整代码可以改善它)因为这种方法似乎有点过头了,就像找到几个字符串并在它们之间拉出任何东西一样简单. 解决方法
您可以使用其中一种快速字符串搜索算法 – 例如
Knuth-Morris-Pratt
?或 Boyer-Moore以查找开始和结束标记的位置,然后读取它们之间的所有数据. 你应该测量它们的性能,因为如此小的搜索模式可能会导致所选算法的常量不够好,值得它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读