Algorithm 存储字符串+;文件系统中的描述

Algorithm 存储字符串+;文件系统中的描述,algorithm,csv,file-storage,Algorithm,Csv,File Storage,我有超过1亿个字符串要存储在文件系统中。与字符串(~255Chars utf8)一起,将有两个日期和一些定义其属性的整数值 我可以把它们放在一个CSV文件中,但它会很大。我可以将几个较小的CSV文件放在子目录中以加快速度,或者我可以简单地为每个字符串创建一个文件并将它们存储在目录树中 我如何知道哪种解决方案更快、更易于维护/开发?我甚至不知道我的弦有多稀疏;也许我有5000万个以相同的字符开头的树,因此这棵树就不那么平衡了 现在我想我可以用前5个字符创建一个目录结构,然后将csv文件放在每个目录

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

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

我如何知道哪种解决方案更快、更易于维护/开发?我甚至不知道我的弦有多稀疏;也许我有5000万个以相同的字符开头的树,因此这棵树就不那么平衡了

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

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

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

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

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

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

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

如果你的字符串没有被排序,你必须这样做,一些合并排序变量可能会很有用,你可以对一亿个字符串(可能是一百万个分区)中的块进行完全排序,然后将这100个排序的分区合并在一起,得到最终的排序列表


如何搜索字符串将是一个二进制搜索log N,搜索1亿条记录,这将是~27 IO读取。

也许可以看看Redis——这取决于你想用字符串做什么——它是快速和可伸缩的。这就是数据库开发的目的……以sqlite为例,如果您想要易于访问的内容,请不要使用自制解决方案。有了这么多的数据,现有的数据库解决方案就可以了。如果不允许安装数据库,我无法想象你会被允许在共享主机上存储1亿个文件。我几乎可以保证,数据库解决方案将比搜索顺序文件消耗更少的CPU时间。谢谢,但我不能使用它。可能是.sqllite@mobinoob-可能你没有读我的全部答案(我的格式不好)。我概述了一个只使用平面文件的完全无SQL的方法。完全是我的错。对不起:(