[英]Efficiently store easily parsable data in a file?
我需要将易于分析的数据存储在文件中,以作为数据库支持的解决方案的替代方案(无需辩论)。 由于它将存储大量数据,因此最好使用轻量级语法。 这不一定必须是人类可读的,但应该是可解析的。 请注意,将会有多种类型的字段/列,其中某些可能会使用,而某些则不会
根据我在没有数据库的情况下的有限经验,我看到了几种选择,所有这些都有问题
因此,它们都有缺点。 但是,当寻求语言支持和较小的文件大小时,最好的方法是什么?
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.