加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用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以查找开始和结束标记的位置,然后读取它们之间的所有数据.

你应该测量它们的性能,因为如此小的搜索模式可能会导致所选算法的常量不够好,值得它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读