高效地将可解析的数据存储在文件中?
我需要将易于解析的数据存储在文件中,作为数据库支持解决方案的替代方案(不用于辩论)。由于要存储大量数据,因此最好使用轻量级语法。这不一定需要人类可读,但应该可以解析。请注意,将是多种类型的字段/列的,可以使用其中的一些,而另一些不会高效地将可解析的数据存储在文件中?
从我有限的经验没有一个数据库中,我看到几个选项,所有的问题
- CSV - 我可以在技术上做到这一点,它非常轻。然而,解析将是一个问题,然后它会吸如果我想添加一列。多语言支持是可能的,主要是人们自己的定制解析器
- XML - 这是从许多方面完美的解决方案,除非涉及解析和开销。这是很多标签,并会产生一个巨大的文件,解析将是非常耗费资源。然而事实上每种语言都支持XML
- JSON - 这是一个中间立场,但我不想这么做,因为它的尴尬语法和解析不是微不足道的。语言支持是可能的。
所以都有它们的缺点。但是,当试图瞄准语言支持并且文件大小有点小时,最好是什么?
如果你只是使用所有这些格式的基础知识,所有的解析器都是微不足道的。如果CSV是一个选项,那么对于XML和JSON,您正在讨论名称/值对的块,因此甚至不涉及递归结构。 json.org几乎支持任何语言。
这就是说。
我没有看到什么问题与CSV。如果人们写错误的解析器,那就太糟糕了。如果您担心兼容性问题,请从Excel中采用默认的CSV模型。任何不能从Excel解析CSV的人都不会在这个世界上走得太远。您在CSV中找到的最弱支持是嵌入换行符和回车符。如果你的数据没有这个,那么这不是问题。只有其他问题是嵌入式引用,并且它们以CSV格式转义。如果你还没有这些,那么它更加微不足道。
至于“添加一列”,你有所有这些问题。如果添加一列,则会重写整个文件。我不认为这是一个大问题。
如果您关心的是空间,CSV是最紧凑的,其次是JSON,其次是XML。没有一个结果文件可以轻松更新。他们几乎都需要重写数据的任何变化。由于CSV没有关闭元素(如JSON和XML),因此CSV具有易于追加的优点。
JSON可能是你最好的选择(它是轻微的,更快的解析和自我描述,所以你可以随着时间的推移添加新的列)。你说过可分析 - 你的意思是使用Java? Java的JSON库可以消除大部分工作中的痛苦。此外,还有各种轻质内存数据库能够坚持到一个文件(万一“不是一种选择”意味着你不想要一个大的单独的数据库)
如果这只是记录一些数据迅速给文件,我发现制表符分隔的文件比CSV更容易解析,所以如果它是一个你想要的平面文本文件,我会去那里(只要你没有标签在饲料当然)。如果您有固定大小的列,则可以使用固定长度的字段。这更快,因为你可以寻求。
如果它可能需要一些分析非结构化数据,我会去JSON。
如果它是结构化数据和你设想过做任何查询就可以了......我会使用SQLite去。
当您添加比列的其余部分长一个字符的行时,制表符分隔似乎很可怕。数据中可能有选项卡。 – TheLQ 2010-08-05 17:29:48
当我需要这样的解决方案时,我写了一个简单的以长度为前缀的数据表示。例如,“Hi”将表示为(十六进制)02 48 69
。
为了形成行只是巢此操作(第一个数字是字段数,然后将字段),例如,如果字段0包含“喜”和字段1包含“ABC”,那么这将是:
Num of fields Field Length Data Field Length Data 02 02 48 69 03 61 62 63
您也可以使用第一行作为列的名称。 (我不得不说这是一种DB后端)。
您可以使用CSV,如果您只在最后添加列,这很容易处理。即如果列数少于预期,则使用“缺少”字段的默认值。
如果你希望能够改变顺序/使用的字段,您可以添加标题行。即第一行具有列的名称。当您尝试读取数据时,这可能很有用。
所以我会在每行的末尾有3-4个空白列? – TheLQ 2010-08-05 17:27:59
我建议解析器假设,如果它试图读取不存在的字段,它们将被视为空白。 – 2010-08-05 20:57:41
如果您被迫使用平面文件,为什么不开发自己的格式?您应该能够调整开销并尽可能多地进行自定义(如果您正在解析大量数据,这很有用)。 数据条目将是固定长度或可变长度,将某些条目强制为固定长度有好处,但您需要创建一个用于分隔两者的方法。如果您有不同的“类型”行,请将每种类型的所有行写入一个块中。每个行块都会有一个标题。使用一个头来描述块的类型,另一个头来描述列和它们的大小。确定您将如何使用标题来描述每个块。
如(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
这是我猜想的,但我正在寻找一个标准的存储位置 – TheLQ 2010-08-05 17:27:29
我会说,如果你想存储的行和列,你必须使用D B。原因很简单 - 使用除RDBMS以外的任何方法修改结构都需要付出很大的努力,并且您提到将来需要更改结构。
如果我使用XML,我可以只添加一个新的标签添加元素。我忘记了那个CSV可以导入到excel电子表格中。 – TheLQ 2010-08-05 17:22:38
然后你的XML不符合。从理论上讲,一个XML文件是一个单一的元素,可能有一百万个这样的子元素。并不是说它不能完成,而是有人这样做,只是说你最终得到的是一个包含多个XML元素的文件,而不是一个符合XML文档的文件。 – 2010-08-05 19:02:47