需要有效扫描大型excel文件中的低端ascii控制字符。

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

我正在研究一个ETL验证过程,以便在处理之前扫描无效的ascii字符。在这种情况下,无效被定义为0-31范围内的ascii字符。

在一个C# ETL验证服务中,我使用OfficeOpenXml来检查excel文件的内容。

除了循环每个工作表、每列和每行之外,有谁知道有什么更有效的方法来搜索内容?文件可能非常大,验证应该尽可能快。

是否可以访问原始xml缓冲区?解压xml文件并扫描那里的内容是否会更快?

c# excel openxml
1个回答
0
投票

首先,我认为是时候进行速度咆哮了。https:/ericlippert.com20121217performance-rant

问题是,现在的瓶颈在哪里。我的直觉告诉我 是磁盘。您正在处理文件,所以通常是磁盘。如果是这样的话,如果不把每个单元格只加载一次到内存中,就不会有太多的加速。

然而,你正在对字符串进行相当深入的处理,因为你必须检查每一个字符。所以可能会有一个 相关 量的时间花费在这上面。很可能不是瓶颈,但你可以将其作为成本来否定。

你也许可以做一些异步化,当你处理这个单元格时,让下一个单元格在后台加载。像这样的方法 Directory.EnumerateFiles()Directory.GetFiles 可能会有用。https:/docs.microsoft.comen-usdotnetapisystem.io.directory.enumeratefiles。

行似乎有一个 GetEnumerator 函数。但它可能只是为了得到一个Enumerator,用于代码的 需要 Enuemrators,而实际上并不包括deferedbackground loading(即像为foreach循环隐式创建的Enumerator一样)。


0
投票

我写了测试线束,并得出了14种变化,使用string[]和List作为数据结构和以下迭代器。

1 : foreach (char c in s.ToCharArray())

2 :

byte[] ASCIIValues = Encoding.ASCII.GetBytes(s);
foreach (byte code in ASCIIValues)

3 :

Regex rx = new Regex(@"/[^ -~]/", RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = rx.Matches(s);

4 :

for(int x=0; x < s.Length; x++)
  • 100,000项以下,在string[]上使用foreach迭代,使用方法2,平均时间最快。
  • 超过100,000个项目,在一个字符串[]上使用Parallel.ForEach,使用方法2,平均时间最快。
  • 使用方法1在字符串[]上使用Parallel.ForEach超过100万个项目,平均速度最快。
  • 在字符串[]上使用Parallel.ForEach或List<>使用所有方法的10,000项以下是最慢的。
  • 在没有并行的情况下,当项数超过50万时,1超越2成为最快的(?
  • 与迭代chars或字节相比,Regex总是比较慢的
  • 对于100,000左右的东西,使用string[]和方法2的foreach循环是最快的。
© www.soinside.com 2019 - 2024. All rights reserved.