【问题标题】:Compress large log file before reading读取前压缩大日志文件
【发布时间】:2015-06-04 00:47:45
【问题描述】:

我们有大量的日志(117 条日志,总共大约 17gb 的数据)。它是纯文本,所以我知道它会很好地压缩。我不是在寻找出色的压缩或速度(但这将是一个很好的奖励)。我目前所做的是获取要读取的日志文件列表(它们在文件名中有一个日期戳,所以我首先过滤)。获得列表后,我使用File.ReadAllLines() 读取每个文件,但我们也对其进行过滤......

private void GetBulkUpdateItems(List<string> allLines, Regex updatedRowsRegEx)
{
    foreach (var file in this)
        allLines.AddRange(File.ReadAllLines(file).Where(x => updatedRowsRegEx.IsMatch(x)));

    allLines.Sort();
}

从网络读取 5 个文件大约需要 22 秒。我想做的是将文件列表压缩成一个 zip 文件。将 zip 文件复制到本地,然后解压缩并完成剩下的工作。问题是我不知道如何开始。由于我使用的是 .net 4.5,我首先尝试了System.IO.Compression.ZipFile,但它需要一个目录,我不想要所有 117 个文件。我看到有人使用网络流和 7zip,这听起来很有希望,而且我相当肯定 7zip 安装在我需要来自的日志的服务器上(可能不重要,因为我们使用 UNC 路径)。所以我被困住了。有什么建议吗?

【问题讨论】:

  • 你可以试试 ZipFileExtensions.CreateEntryFromFile。此处提供详细信息msdn.microsoft.com/en-us/library/hh485724%28v=vs.110%29.aspx
  • @PraveenPaulose 我给了你的建议。对于 17 meg 的日志文件,它似乎可以正常工作,但后来我在我拥有的最大文件(670mb)上尝试了它,并通过内存不足异常进行了尝试。讨论了一些,我认为我们要做的是使用已经在同一台服务器上运行的不同程序压缩日志。然后这个程序可以只复制压缩文件并从他们那里做它需要做的事情。
  • 如果这是一个选项,您不妨这样做。将节省编码时间和精力:)

标签: c# performance compression


【解决方案1】:

ZipArchiveZipFile 的底层类,允许更精细的操作。

添加硬编码文本的文章示例:

using (FileStream zipToOpen = new FileStream(
           @"c:\users\exampleuser\release.zip", FileMode.Open))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
    {
        ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
        using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
        {
                writer.WriteLine("Information about this package.");
                writer.WriteLine("========================");
        }
    }
}

正如Praveen Paulose 建议的那样,您可以使用ZipFileExtensions.CreateEntryFromFile 从文件创建条目以添加到存档中。

【讨论】:

  • 见我上面的评论。基本上这个解决方案不起作用,因为对于非常大的文件,我的内存不足。我可以花时间缓冲它并将其分成更小的块......或者我们的解决方案是使用已经部署在服务器上的程序来归档日志。
  • @RobertSnyder 我有点惊讶ZipArchiveStream.CopyTo 使用了大量内存(但我没有尝试自己打包大文件,所以很可能会发生)。实际上,使用基本的Process.Start 并将要压缩的文件列表传递给您使用的程序,运行外部程序会更简单。
  • 我什至不必使用进程启动。该程序是一个计划任务,它检查文件的“最后写入时间”。如果它是 x 天,那么它会清除它。清除包括将文件压缩为 zip,然后删除原始文件。文件名中有一个日期戳,所以我只是根据它过滤文件。
  • @RobertSnyder 没有意识到您正在寻找非 C# 解决方案。事实上,使用现有工具通常是更好的方法。
  • 我在寻找 C# 解决方案。我真的更喜欢它。从技术上讲,它仍然是一个 C# 解决方案(文件清除程序是我们用 C# 编写的一个程序,从 windows 任务调度程序调用)
猜你喜欢
  • 2022-01-06
  • 2015-08-15
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2013-12-08
相关资源
最近更新 更多