【问题标题】:Slow performance when extracting Exif data using metadata-extractor使用元数据提取器提取 Exif 数据时性能下降
【发布时间】:2020-04-19 06:05:34
【问题描述】:

我有一个相当简单的任务——我需要从一组图像中提取创建日期、上次修改日期和拍摄日期,并将它们写入文本文件。对于拍照日期,我使用的是metadata-extractor

这是一些示例代码,

    List<FileInfo> fileList = Utils.FileList(targetPath, true);
    foreach (FileInfo fi in fileList)
    {
        string dateTime = "";
        try
        {
            var metadatadir = ImageMetadataReader.ReadMetadata(fi.FullName);
            var subIfdDirectory = metadatadir.OfType<ExifSubIfdDirectory>().FirstOrDefault();
            dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTimeOriginal);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        DateTime creationDate = File.GetCreationTime(fi.FullName);
        DateTime modifiedDate = File.GetLastWriteTime(fi.FullName);
        string outputLine = "Filename " + fi.Name + "\t Creation Time: " + creationDate +
            "\t Modified Time: " + modifiedDate + "\t" + "Exif Time: " + dateTime + "\n";
        File.AppendAllText(targetFile, outputLine);
        fileCount++;
    }

我在这个块周围包裹了一个Stopwatch 对象来测量性能,这就是我得到的结果,

在 440218 毫秒内处理了 2244 个文件。

如果我注释掉 Exif 代码(try-catch 块),我会得到,

在 116928 毫秒内处理了 2244 个文件。

我是否错误地使用了库?有没有更快的提取数据的方法?

编辑根据反馈我已改用StreamWriter,如下所示,

using (StreamWriter tFile = File.AppendText(targetFile))
{
    // Code
    tFile.WriteLine(outputLine);
}

基于这一最新更改,使用 Exif 代码所花费的时间减少了一半,

在 212278 毫秒内处理了 2244 个文件。

【问题讨论】:

  • 您的代码与 this answer 相同(subIfdDirectory?.GetDescription()subIfdDirectory?.GetDateTime() 除外)来自自称是该库的作者并吹捧其性能与 System.Drawing.Image 相比的人,所以大概这是正确的用法。如果您知道输入格式并且可以限制请求的元数据,它确实提供了一种替代方法。
  • 该代码基于 GitHub 上此库的示例,并指定在 StackOverflow 上发布时使用 metadata-extractor 标记。感谢您的链接。
  • 在您的情况下,性能可能取决于 I/O。现在,您使用的代码提取了所有文件格式的所有元数据类型。如果你只想要 JPEG 文件的 Exif,它可能会提高性能。
  • 不是在循环中调用 File.AppendAllText,而是创建一个流编写器并花在那个上,这样您只打开和关闭输出文件一次,而不是每个输入文件一次。它也将允许更多的缓冲。
  • 我在用手机,但如果您更详细地解释您的用例,很快就能找到一些代码。

标签: c# .net metadata-extractor


【解决方案1】:

基于来自Drew Noakes的以下cmets,

在您的情况下,性能可能取决于 I/O。现在你的代码 using 提取所有文件格式的所有元数据类型。如果你只 想,天,JPEG文件的Exif,也许可以改进 性能

而不是调用 File.AppendAllText 在循环中,创建一个 StreamWriter 并花费 那,这样你就只打开和关闭输出文件一次,而不是 每个输入文件一次。它也将允许更多的缓冲。

我确实做到了这一点,并且性能速度翻了一番,这对于我的目的来说已经足够了。请参阅原始帖子中的编辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多