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

时间:2010-08-05 03:50:01

标签: java logging storage

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

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

  • CSV - 技术上我可以做到这一点,它非常轻。然而,解析将是一个问题,如果我想添加一个列,它会很糟糕。多语言支持是不确定的,主要是人们自己的自定义解析器
  • XML - 除了涉及解析和开销之外,这是许多方面的完美解决方案。这是很多标签,会产生一个巨大的文件,解析将非常耗费资源。但实际上每种语言都支持XML
  • JSON - 这是中间立场,但我并不是真的想这样做,因为它的语法很笨拙而且解析非常重要。语言支持是不确定的。

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

8 个答案:

答案 0 :(得分:3)

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

此外,如果您以后最终使用数据库后端,则切换起来相当容易。

如果这不合适,我会建议一个类似DBM的商店进行键值查找,例如Berkely DB或tdb。

答案 1 :(得分:1)

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

那就是说。

我不知道CSV有什么问题。如果人们写错解析器,那就太糟糕了。如果您担心兼容性,请使用Excel中的默认CSV模型。任何无法从Excel解析CSV的人都不会在这个世界上走得太远。您在CSV中找到的最弱支持是嵌入式换行和回车。如果您的数据没有这个,那么这不是问题。只有其他问题是嵌入式报价,并且这些报价以CSV格式转义。如果你没有那些,那么它就更加微不足道了。

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

如果您关心空间,CSV是最紧凑的,其次是JSON,其次是XML。生成的文件都不能轻易更新。他们几乎都需要为数据的任何变化进行重写。 CSV的优点是可以轻松附加,因为没有关闭元素(如JSON和XML)。

答案 2 :(得分:0)

JSON可能是你最好的选择(它更轻松,解析速度更快,并且具有自描述性,因此您可以随着时间的推移添加新列)。你说可解析 - 你的意思是使用Java吗?有一些Java的JSON库可以解决大部分工作带来的痛苦。内存数据库中还有各种轻量级数据可以持久保存到文件中(如果“不是选项”意味着你不需要一个大的独立数据库)

答案 3 :(得分:0)

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

如果是可能需要进行分析的非结构化数据,我会选择JSON。

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

答案 4 :(得分:0)

当我需要这样的解决方案时,我写了一个前缀为length的数据的简单表示。例如,“Hi”将表示为(十六进制)02 48 69 要形成行,只需嵌套此操作(第一个数字是字段数,然后是字段数),例如,如果字段0包含“Hi”而字段1包含“abc”,那么它将是:

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

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

答案 5 :(得分:0)

您可以使用CSV,如果只添加列,则可以轻松处理。即如果列数少于预期,请使用“缺失”字段的默认值。

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

答案 6 :(得分:0)

如果您被迫使用平面文件,为什么不开发自己的格式?您应该能够调整开销并根据需要进行自定义(如果您要解析大量数据,这很好)。 数据条目可以是固定长度,也可以是可变长度,将某些条目强制为固定长度是有好处的,但是您需要创建一个用于分隔两者的方法。如果您有不同的“类型”行,请在块中写入每种类型的所有行。每个行块都有一个标题。使用一个标头来描述块的类型,使用另一个标头来描述列及其大小。确定如何使用标题来描述每个块。

例如(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

答案 7 :(得分:0)

我想说如果你想存储行和列,你必须使用数据库。原因很简单 - 使用除RDBMS之外的任何方法修改结构都需要付出很大的努力,并且您提到要在将来更改结构。