并行处理 ZipArchive 条目

问题描述 投票:0回答:1

我需要将 ZipArchive 条目处理为字符串。目前我有这样的代码:

using (ZipArchive archive = ZipFile.OpenRead(zipFileName))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        using (StreamReader sr = new StreamReader(entry.Open()))
        {
            string s = sr.ReadToEnd();
            // doing something with s
        }
    }
}

如果使用 Parallel.ForEach 或类似循环在多个 CPU 核心上并行完成,处理速度可能会快得多。问题是

ZipArchive
不是线程安全的。

也许,我们可以使用 Partitioner 类从 ZipArchive.Entries 获取范围,将它们输入到

Parallel.ForEach
循环中,然后再次打开 zip 存档,循环体中的每个条目都使用
ZipArchive 的新实例
线程安全,但我不知道该怎么做。可以吗?

如果没有,如果我们只需要读取它们,是否有另一种可靠的方法来并行处理 zip 存档条目?

.net multithreading zip task-parallel-library parallel.foreach
1个回答
0
投票

只需让每个线程创建自己的

ZipArchive
ZipArchiveEntry
对象即可。遍历中央目录只需要很少的时间,因此为每个线程指定一个自己的编号 n 来处理哪个条目,然后给定的线程将遍历条目 n 次以到达其条目。多个
ZipArchive
对象读取同一个 zip 文件应该没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.