代码之家  ›  专栏  ›  技术社区  ›  User1

如何快速推断只显示开始时间的文件的开始/结束时间?

  •  0
  • User1  · 技术社区  · 14 年前

    我有一个巨大的视频文件列表,它来自一个摄像头,看起来像这样:

    video_123
    video_456
    video_789
    ...
    

    我有一个工具,可以提取出视频的一部分给定的时间范围和一组文件。但是,如果我只给工具提供在给定范围内有帧的文件,它会运行得更快。确定每个文件的持续时间是非常昂贵的。相反,我想使用开始时间戳来排除大多数文件。例如,如果我想要500-600的视频,我知道 video_123 不需要,因为 video_456 更大。也, video_789

    我可以做一个 ls 然后遍历每个文件,将时间戳转换为int并进行比较,直到找到一个大于所需范围的文件。我有很多文件,这很慢。有更快的方法吗?我想用某种二叉树,它可以得到log2n的搜索时间,并且已经解析出时间戳。我在bash中完成了大部分工作,希望使用简单、通用的工具,如grep、awk等。但是,如果有令人信服的原因,我将考虑使用Perl或其他大型脚本语言。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Diego Sevilla    14 年前

    如果对这些文件进行了多次搜索,可以预先处理这些文件,即将它们加载到bash数组(注意,bash,而不是sh)中,对它们进行排序,然后执行二进制搜索。假设文件名只是时间标记,这将简化示例(您可以一直这样做 ${variable/video_/} 删除前缀。)

    首先,可以使用数组加载排序的所有文件:

    files=(`echo * | sort -n`)
    

    然后实现二进制搜索(只是一个草图,搜索pos $min $max ):

    nfiles=${#files[*]}
    nfiles2=`expr $nfiles / 2`
    if test ${files[$nfiles2]} -gt $max
    then
        nfiles2=`expr $nfiles2 - $nfiles2/2`
    else
        #check $min, etc.
    fi
    

    等等。如果在数组中对文件排序后进行多次搜索,则可以加快查找速度。

        2
  •  0
  •   Jander    14 年前

    ls .

    也就是说,如果你愿意移动你的文件,你可以把你的平面目录变成一棵树,通过拆分最有意义的数字。而不是:

    video_12301234
    video_12356789
    video_12401234
    video_13579123
    

    你可以:

    12/video_12301234
    12/video_12356789
    12/video_12401234
    13/video_13579123
    

    甚至:

    12/30/video_12301234
    12/35/video_12356789
    12/40/video_12401234
    13/57/video_13579123