繁体   English   中英

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

[英]Efficiently store easily parsable data in a file?

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

根据我在没有数据库的情况下的有限经验,我看到了几种选择,所有这些都有问题

  • CSV-从技术上讲,我可以做到这一点,而且它非常轻便。 但是,解析将是一个问题,然后,如果我想添加一列,它将很烂。 支持多种语言,主要是人们自己的自定义解析器
  • XML-这是许多方面的理想解决方案,除了涉及解析和开销方面。 那就是很多标签,并且会生成一个巨大的文件,而解析将非常消耗资源。 但是实际上每种语言都支持XML
  • JSON-这是中间立场,但是我真的不想这样做,因为它的语法很尴尬,而且解析是不平凡的。 语言支持不明确。

因此,它们都有缺点。 但是,当寻求语言支持和较小的文件大小时,最好的方法是什么?

sqlite怎么样? 这将使您基本上可以在应用程序中嵌入“数据库”,而不需要单独的数据库后端。

另外,如果您以后使用数据库后端,则切换起来应该相当容易。

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

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

那就是。

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

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

如果您担心空间不足,则CSV是最紧凑的格式,其次是JSON,其次是XML。 任何结果文件都无法轻松更新。 对于数据中的任何更改,几乎都需要重写它们。 CSV的优点是易于附加,因为没有结束元素(如JSON和XML)。

JSON可能是最好的选择(它比较轻巧,解析速度更快并且具有自我描述性,因此您可以随着时间的流逝添加新列)。 您已经说过可分析的-您是说使用Java? 有Java的JSON库可以减轻大部分工作的负担。 内存数据库中还存在各种轻量级的文件,它们可以持久存储到文件中(以防“ not option”意味着您不需要大型的独立数据库)

如果这只是为了将一些数据快速记录到文件中,我发现制表符分隔的文件比CSV更容易解析,因此,如果您要查找的是纯文本文件,我会使用它(只要您不当然在供稿中没有标签)。 如果具有固定大小的列,则可以使用固定长度的字段。 这样甚至更快,因为您可以寻求。

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

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

当我需要像这样的解决方案时,我写了一个简单的以长度为前缀的数据表示形式。 例如,“ 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

您也可以将第一行用作列的名称。 (我必须说这是一种数据库后端)。

您可以使用CSV,并且如果仅将列添加到末尾,则很容易处理。 即,如果您的列少于预期,请为“缺少”字段使用默认值。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM