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

使用最小公分母的UTF-8元组存储,仅附加

  •  1
  • Zarkonnen  · 技术社区  · 16 年前

    编辑:请注意,由于硬盘驱动器实际写入数据的方式,此列表中的任何方案都不能可靠工作。不要使用它们。只需使用数据库。sqlite很简单。

    在磁盘上存储UTF-8字符串的元组,哪种方法技术最差但最可靠?为确保可靠性,应追加存储。

    作为文档存储系统的一部分,我正在尝试在磁盘上存储UTF-8元组数据。显然,对于全面的实现,我希望使用类似于AmazonS3、ProjectVoldemort或CouchDB的工具。

    然而,目前,我正在进行试验,甚至还没有确定一种编程语言。我一直在使用csv,但当你试图存储奇怪的unicode和意外的空白(如垂直标签)时,csv会变得脆弱。

    我可以使用XML或JSON进行存储,但它们不能很好地处理只附加文件。到目前为止,我的最佳猜测是一种相当特殊的格式,其中每个字符串前面都有一个4字节的有符号整数,表示它包含的字节数,整数值-1表示这个元组是完整的,相当于一个csv换行符。头疼的主要原因是必须决定磁盘上整数的结尾。

    编辑:事实上,这行不通。如果程序在写入字符串时退出,数据将不可恢复地错位。需要某种带外信号来确保在中止的元组之后可以重新对齐。

    编辑2:结果表明,在附加到文本文件时保证原子性是可能的,但是解析器是非常重要的。正在写入所述解析器。

    编辑3:您可以在以下位置查看最终结果: http://github.com/MetalBeetle/Fruitbat/tree/master/src/com/metalbeetle/fruitbat/atrio/ .

    2 回复  |  直到 13 年前
        1
  •  2
  •   Jeffrey L Whitledge    16 年前

    我建议用制表符分隔每个字段,用回车符分隔每个记录。

    在每个字符串中,替换所有会影响字段和记录解释和呈现的字符。这将包括控制字符(U+0000__U+001F、U+007F__U+009F)、非图形行和段落分隔符(U+2028,U=2029)、方向控制字符(U+202A_U+202E)和字节顺序标记(U+FEFF)。

    它们应该替换为等长的转义序列。转义序列应该以一个罕见的(对于您的应用程序)字符开始。转义符本身也应该转义。

    这将允许您轻松附加新记录。它还有一个额外的优点,即能够将文件加载到任何电子表格或字处理程序中,以便进行可视化检查和修改,这对于调试很有用。

    这也很容易编码,因为文件是有效的UTF-8文档,所以可以使用标准的文本读写例程。这还允许您根据需要轻松地转换为utf-16be或utf-16le,而不会出现复杂的情况。

    例子:

    U+0009 CHARACTER TABULATION becomes ~TB
    U+000A LINE FEED            becomes ~LF
    U+000D CARRIAGE RETURN      becomes ~CR
    U+007E TILDE                becomes ~~~
    etc.
    

    选项卡优于逗号作为字段分隔符的原因有两个。逗号在普通文本字符串(如英语文本)中更常见,必须更频繁地替换。电子表格程序(如Microsoft Excel)更自然地处理以制表符分隔的文件。

        2
  •  1
  •   Christoffer Hammarström    16 年前

    大部分时间都在想…

    真正的低技术是使用(例如)空字节作为分隔符,并且只“引用”输出中出现的所有空字节,并附加一个空值。

    也许可以用 SCSU 还有这个。

    或者值得一看 gzip 格式化,如果不使用它,也可以模仿它:

    gzip文件由一系列“成员”(压缩数据集)组成。

    […]

    成员只是在文件中逐个出现,在它们之前、之间或之后没有附加信息。

    这些成员中的每一个都可以有一个可选的“文件名”、注释等,我相信您可以继续附加成员。

    或者你可以用 bencode ,在Torrent文件中使用。或 BSON .

    也见 Wikipedia's Comparison of data serialization formats .

    否则,我认为您在每个字符串前面加上其长度的想法可能是最简单的。

    推荐文章