代码之家  ›  专栏  ›  技术社区  ›  TheLQ

高效地将易于分析的数据存储在文件中?

  •  0
  • TheLQ  · 技术社区  · 15 年前

    我需要将易于分析的数据存储在一个文件中,作为数据库备份解决方案的替代方案(不需要讨论)。因为它将存储大量数据,所以最好是轻量级语法。这不一定是人类可读的,但应该是可分析的。请注意,将有多种类型的字段/列,其中一些可能会被使用,而另一些则不会

    根据我在没有数据库的情况下的有限经验,我看到了几个选项,都有问题

    • 我可以技术上做到这一点,它是非常轻。然而,解析将是一个问题,如果我想添加一个列,那么它将很糟糕。多语言支持是不确定的,主要是人们自己的自定义解析器
    • XML—从很多方面来看,这是一个完美的解决方案,除了解析和开销。这会产生大量的标签,并且会生成一个巨大的文件,解析会非常消耗资源。然而,几乎每种语言都支持XML
    • JSON——这是一个折衷的方法,但我并不想这么做,因为它的语法很难理解,解析也很重要。语言支持是不确定的。

    所以都有缺点。但是,当试图寻求语言支持和较小的文件大小时,什么是最好的呢?

    8 回复  |  直到 15 年前
        1
  •  1
  •   Will Hartung    15 年前

    如果您只是使用所有这些格式的基础知识,那么所有的解析器都是微不足道的。如果CSV是一个选项,那么对于XML和JSON,您谈论的是名称/值对块,因此甚至不涉及递归结构。org支持几乎所有的语言。

    也就是说。

    至于“添加列”,您对所有这些都有问题。如果添加一列,就可以重写整个文件。我也不认为这是个大问题。

    如果您关心的是空间,CSV是最紧凑的,其次是JSON,然后是XML。所有生成的文件都无法轻松更新。如果数据有任何变化,它们几乎都需要重写。CSV的优点是易于附加,因为没有结束元素(如JSON和XML)。

        2
  •  3
  •   Jeremy Kerr    15 年前

    怎么样 sqlite ? 这将允许您在应用程序中基本上嵌入“DB”,但不需要单独的DB后端。

    另外,如果以后使用DB后端,切换起来应该相当容易。

    如果这不合适,我建议使用类似DBM的存储来查找键值,比如Berkely DB或tdb。

        3
  •  0
  •   Paul Jowett    15 年前

    JSON可能是您的最佳选择(它轻巧、解析速度更快,而且是自描述性的,因此您可以随着时间的推移添加新的列)。你说过parsable-你是说使用Java吗?Java有JSON库可以减轻大部分工作的痛苦。还有各种轻量级内存中数据库可以持久化到一个文件(如果“not an option”表示您不需要一个大的独立数据库)

        4
  •  0
  •   WOPR    15 年前

    如果这只是为了快速地将一些数据记录到一个文件中,我发现用制表符分隔的文件比CSV更容易解析,所以如果你要找的是一个平面文本文件,我会同意(当然,只要你的提要中没有制表符)。如果有固定大小的列,则可以使用固定长度的字段。这是更快的,因为你可以寻找。

    如果它是结构化数据,并且你想对它进行任何查询。。。我会选择sqlite。

        5
  •  0
  •   Daniel    15 年前

    当我需要这样的解决方案时,我编写了一个以长度为前缀的数据的简单表示。例如,“Hi”将表示为(十六进制) 02 48 69 .

    Num of fields   Field Length   Data    Field Length   Data
    02              02             48 69   03             61 62 63
    

    也可以使用第一行作为列的名称。 (我不得不说这是一种数据库后端)。

        6
  •  0
  •   Peter Lawrey    15 年前

    您可以使用CSV,如果您只在末尾添加列,这很容易处理。i、 e.如果列数少于预期,请使用“缺少”字段的默认值。

    如果希望能够更改字段的顺序/用法,可以添加标题行。i、 第一行有列的名称。这在您尝试读取数据时非常有用。

        7
  •  0
  •   Emma    15 年前

    如果您被迫使用平面文件,为什么不开发自己的格式?您应该能够调整开销,并根据需要进行定制(如果您正在解析大量数据,这是很好的)。

    例如(H是标题,C是列描述,D是数据输入):

    H Phone Numbers
    C num(10) type
    D 1234567890 Home
    D 2223334444 Cell
    
    H Addresses
    C house(5) street postal(6) province
    D 1234_ "some street" N1G5K6 Ontario
    
        8
  •  0
  •   Eugene Mayevski 'Callback    15 年前