1

我有超过 1 亿个字符串要存储在文件系统上。连同字符串 (~255Chars utf8) 将有两个日期和一些定义其属性的整数值。

我可以将它们放在一个 CSV 文件中,但它会很大。我可以将几个较小的 CSV 文件放在子目录中以使其更快,或者我可以简单地为每个字符串创建一个文件并将它们存储在目录树中。

我如何知道哪种解决方案更快、更容易维护/开发?我什至不知道我的弦有多稀疏;也许我有 5000 万个以相同的字符开头,从而使树不那么平衡。

现在我想我可以用前 5 个字符创建一个目录结构,然后将 csv 文件放在每个目录中。例如。字符串“我不知道我在做什么”->“Idontknowwhatimdoing”进入

/i/d/o/n/t/list.csv

有更好的主意吗?我不能使用 Db。我使用 java 来存储和 php 来读取文件系统,如果这有什么不同的话。

4

1 回答 1

1
  • 带有索引的数据库会更加优化。
  • 以下有固定记录大小的警告。

如果您的字符串是 ASCII ,您只需要一个字节来定义每个字符(与 UTF8 相比,某些字符可能编码为 4 个字节),那么您可以为每条记录使用具有固定大小的平面文件。如果您的字符串确实需要是 UTF8,则选择固定大小的编码而不是可变大小的编码,或者只需找到最大的字符串并将其用作固定大小。

256 字节(字符串)+ 8 字节(日期)+ 8 字节(日期)+ 8 字节(整数)+ 8 字节(整数)= 每条记录 288 字节

1 亿(条目)* 288 字节(记录大小)= 28.8 GB

访问这样的巨型文件意味着您必须使用内存映射文件,其中操作系统只负责将您当前正在访问的文件的一部分放入内存中。

如果您的字符串未排序,则必须这样做,一些合并排序变体可能会很有用,您可以完全排序 1 亿个字符串的块(可能是 100 万个分区),然后将这 100 个已排序的分区合并在一起以获得最终排序列表。

如何搜索字符串将是二进制搜索 日志 N,用于 1 亿条记录,大约 27 次 IO 读取。

于 2015-12-18T17:07:25.307 回答