使用单个大型数据文件或大量小型数据文件更好 - 哪个更快?

时间:2015-01-08 15:45:01

标签: database

我想制作一个程序来记录大学的学生并提供搜索方法。 以下哪种方法会更快?

  1. 为每个学生制作一个文件

  2. 制作单个数据文件并进行搜索?

  3. 不同学生的学生数据大小会有所不同。

1 个答案:

答案 0 :(得分:3)

具体为operating systemfile system。一些常规提示(隐含关注Linux系统,具有足够好的文件系统,如Ext4BTRFS等等。

  • 考虑使用database,可能只是Sqlite,或者像PostGreSQLMongoDB这样的DBMS(indexing对性能至关重要)< / p>

  • 您的问题取决于数据大小。如果您确定它足够小,可以轻松放入RAM中(例如,在最近的笔记本电脑或台式机上不到100兆字节),您可以serialize使用JSON等文本格式对所有数据进行反序列化。 。相反,如果您确定数据中心大小的数据(几PB),则非常的内容不同。

  • 一般情况下,避免使用许多小文件,例如十万个千字节大小的文件。喜欢更少但更大的文件(但如果可能的话,请避免巨大的文件大小,例如太字节或大于最大磁盘或分区的一半;但请参阅LVM)。

  • 也许像GDBM这样的索引文件库是值得的。

  • 如果您需要拥有大量文件,请将它们放在子目录中:因此dir01/subdir02/file0345.txt优于file01020345.txt;避免使用大型目录超过一千个文件。 (请参阅有关Ext2的wikipage图以了解原因)。

  • 您可能采用混合方法:某些数据库中的内容较小(例如小于兆字节),文件中的内容较大(数据库中包含一些元数据)。另请阅读binary large objects(BLOB)。

  • 另请阅读application checkpointingpersistence

  • 定义,实现和测试一些backup和一些恢复(人工)程序。对于(不是巨大的)数据库,以文本格式(例如SQL)转储它。

因此,您的工作应首先估算数据的大小,以及访问(和更改)的方式(以及更改频率)。

如果是家庭作业且您不允许使用外部库,则应将文件组织成固定大小记录(随机访问,例如使用fseek(3)lseek(2) ) - 可能编码为一些tagged union并关心索引(使用例如hash-tablesB-tree技术)。您可能需要管理几个低级别记录的linked lists来处理大数据。

研究 sqlite GDBM 的实现(两者都是free software,你应该下载并研究它们的源代码)将是鼓舞人心的。

请注意,大多数大学只有几十个学生,我想每个学生都需要几个(或十几个)千字节(除非你想存储每个学生的照片或视频!)用于身份,分数和课程信息。所以在实践中你可能只需要几十兆字节(可能是两千兆字节),而今天它只适用于RAM。