使用php搜索非常大的文件以非常有效地提取块
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用php搜索非常大的文件以非常有效地提取块,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1731字,纯文字阅读大概需要3分钟。
内容图文
![使用php搜索非常大的文件以非常有效地提取块](/upload/InfoBanner/zyjiaocheng/792/ec515278075b4b66a16ea2127105b329.jpg)
我最近一直在解析视频文件中的元数据,并且发现部分问题是视频制作软件供应商(以及其他原因)无视各种标准(或者至少是互动的差异).
因此,我需要能够扫描各种格式,容器和编解码器的非常大的视频(和图像)文件,并挖掘出元数据.我已经有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, 0, $startLen - 1);
$finished = ($target == $searchStart);
}
else
{
$target = $currChar . substr($target, 0, $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以查找开始和结束标记的位置,然后读取它们之间的所有数据.
你应该测量它们的性能,因为如此小的搜索模式可能会导致所选算法的常量不够好,值得它.
内容总结
以上是互联网集市为您收集整理的使用php搜索非常大的文件以非常有效地提取块全部内容,希望文章能够帮你解决使用php搜索非常大的文件以非常有效地提取块所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。