【问题标题】:parsing versus serializing解析与序列化
【发布时间】:2011-01-20 03:58:27
【问题描述】:

我有一个格式如下的文件:

1 4298 3598 39980 58903
39 3598 395 395 3598 3598

所以每行只有一堆数字(32 位有符号整数范围内的最大数字)。

我当前的代码每次都必须解析它,首先将行拆分为字符串数组,然后将每个字符串转换为 int。有没有一种更快的方法可以通过序列化或其他方式来完成此操作,因为我必须多次检查同一个文件。换句话说,我很乐意对文件进行预处理。

【问题讨论】:

  • 我不确定你在追求什么 - 将这样的文件解析为整数值列表就像 3 行代码;我看不出您想如何从中“删除大部分解析” - 请指定。
  • Errr.. 如果代码只能以二进制格式读取并假设它是 32 位数字,则可以避免很多 CPU 周期。这个文件非常非常大,我必须检查它数千次(内存中没有任何内容)。
  • 无法缓存,太大了。
  • 如果您逐行阅读,您当前的逻辑对我来说听起来不错。唯一需要注意的是,如果您需要一次又一次地引用该行,然后将其缓存到内存中,而不是再次读取它。此外,如果您必须一个接一个地处理 n 行 - 只需保持文件句柄打开(这样您就不必再次打开并寻找文件中的相关位置)。
  • 只需阅读评论 - 文件很大 - 到底有多大?无论如何,您可以在可以缓存最近使用(或最常用)的行的地方实现缓存。

标签: c# parsing


【解决方案1】:

为什么没有二进制格式的文件?如果您只想获取数值,则完全不需要字符串转换。一次读入四个字节,并通过按位运算使用它们创建一个整数。序列化是一种默认机制,旨在为程序员提供一种存储对象的简单方法,但精心规划的文件格式将更容易和更快地解析。

【讨论】:

  • 这就是我所追求的,你能给我一些关于 c# 代码的想法,可能会为我指明正确的方向吗?我可以在 c 中做到这一点,但我正在使用 c#,据我所知,我不能做我不安全的魔术。
  • 很遗憾,我不懂C#,但是搜索了一下,发现微软提供了BinaryReader和BinaryWriter类。 msdn.microsoft.com/en-us/library/…, msdn.microsoft.com/en-us/library/….
【解决方案2】:

如果数据是静态的并且不是很大,您可能需要考虑将其转换为源代码并将其编译到您的程序/系统中。

【讨论】:

    【解决方案3】:

    序列化就是获取一个对象的内存映像,然后将字节传输或读取到其中。因此,除非您可以强制 List<int> 具有该格式,否则序列化将无济于事。

    【讨论】:

      【解决方案4】:

      如果您不介意放弃人类可读性,您可以在文件中将每个 int 编码为 char。您可以使用 Convert.ToChar(Int32) 和 Convert.ToInt32(char) 进行转换。如果 int 的 char 表示形式不是有效字符,您需要测试性能并确保不会遇到问题。

      【讨论】:

        猜你喜欢
        • 2016-07-18
        • 2011-12-05
        • 1970-01-01
        • 2012-08-11
        • 2015-09-21
        • 1970-01-01
        • 2010-12-25
        • 2013-05-17
        • 2015-07-28
        相关资源
        最近更新 更多