【问题标题】:What file format do you use for your application and why?您的应用程序使用什么文件格式,为什么?
【发布时间】:2010-10-01 08:56:01
【问题描述】:

我最感兴趣的是处理大量变异的面向对象数据的进程内(单用户)解决方案,其中数据的任何部分都可能发生变化。此类系统通常存在以下问题:

  • 从头开始编写大文件效率低下
  • xml 太冗长
  • SQL blob 不是很好的匹配项

那么你是怎么做到的呢?

【问题讨论】:

  • 我不确定问题出在哪里:每个对象都很大,还是你有很多很多?为什么是“SQL blobs”?您是否有任何理由无法将对象映射到结构正确的关系表?
  • 每个对象都很小,但数量很多。我事先不知道它们的格式,因为它可能是在组件插件 dll 中定义的。每个对象负责自己的格式。

标签: storage desktop-application blob file-format


【解决方案1】:

或使用几种可用的开箱即用解决方案之一进行映射。

【讨论】:

    【解决方案2】:

    这取决于您的要求。你真的会为高分辨率图片或音频使用 XML 或 SQL 块吗?

    我再次阅读您的问题:如果您有一堆任意对象要存储在文件图像中,那么将它们放入/取出的方法是复制和重定位。 out-copy 可以得到 GC 的帮助。 in-copy 真的很简单,主要取决于重定位例程。

    如果需要处理非常大的文件,我会在该系统中提供一些方法来标记对象“脏”,以及标记它们在文件图像中的实际位置。

    还需要在已删除的对象中进行标记,除非您从未删除任何内容。

    【讨论】:

      【解决方案3】:

      我们主要使用二进制数据。除非它必须是人类可读的(如设置和用户偏好)。

      如果您认为 xml 过于冗长,请查看 JSON。我认为这是一个很好的选择。

      【讨论】:

      • 是的,但是怎么样?!我认为任何 ASCII 格式都会过于冗长
      【解决方案4】:

      “从头开始写大文件效率低下”什么?很少有东西像文件 I/O 一样快。请提供一些示例或数据来支持您对文件 I/O 效率低下的断言。

      大多数 OO 系统可以将对象序列化或腌制到文件中。这大约是最快的 I/O。

      此外,大多数 OO 系统可以将对象转换为标准表示形式,例如 XML、JSON 或 YAML。

      JSON/YAML 比 XML 更简洁,更容易解析。

      【讨论】:

      • 我一般用C++,文件IO一般是瓶颈。想象一个 1GB 的文件,它由不断变化的对象层次结构组成。每次层次结构中的一个对象发生变化时,您不能只写出整个文件。
      • 如果您为每次更改都重写整个结构,那么,您可能做错了。也许您需要文件层次结构以便本地化更改?
      • 呵呵 - 因此评论“从头开始编写大文件效率低下” - Jesse 清楚地知道这是一种不好的方法并且没有这样做!
      • 重点是——文件 I/O 是最快的。 RDBMS 或 OODBMS 的效率将低于原始文件 I/O。使用简单的文件 I/O 编写实际更改的对象会很快。写所有东西都会比写 deltas 慢,但比任何数据库都快。
      【解决方案5】:

      我使用 YAML 处理中小型文件,非常容易解析和保存。 JSON 是一个不错的选择。

      【讨论】:

        【解决方案6】:

        您可以尝试序列化为 XAML,而不是 XML。 这可以创建更小的文件,并且读写速度更快(序列化/反序列化)。

        显然,依赖于 XAML 作为一个选项。

        【讨论】:

          【解决方案7】:

          您需要 O/R 映射或像 db4o 这样的对象数据库。

          如果是一组相对独立的对象,也可以将每个对象存储到自己的文件中,并且只在对象脏时写入。但显然,在更复杂的情况下,保持引用的正确性和避免不直观的目录结构可能需要做很多工作,而这确实是 O/R 映射器和对象数据库所带来的。

          至于 XML 过于冗长,通常可以通过压缩来解决(例如 zip 中的 xml)。

          【讨论】:

            【解决方案8】:

            对于大型数据集,我使用结构化二进制文件,没有什么比节省空间和时间更有效了。

            对于结构化文本数据,我会使用 s 表达式(即LAML)或 减少使用 as 在 i 表达式中实现的括号 LAML。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-14
              • 1970-01-01
              相关资源
              最近更新 更多