我想制作一个程序来记录大学的学生并提供搜索方法。 以下哪种方法会更快?
为每个学生制作一个文件
制作单个数据文件并进行搜索?
不同学生的学生数据大小会有所不同。
答案 0 :(得分:3)
具体为operating system和file system。一些常规提示(隐含关注Linux系统,具有足够好的文件系统,如Ext4,BTRFS等等。
考虑使用database,可能只是Sqlite,或者像PostGreSQL或MongoDB这样的DBMS(indexing对性能至关重要)< / p>
您的问题取决于数据大小。如果您确定它足够小,可以轻松放入RAM中(例如,在最近的笔记本电脑或台式机上不到100兆字节),您可以serialize使用JSON等文本格式对所有数据进行反序列化。 。相反,如果您确定数据中心大小的数据(几PB),则非常的内容不同。
一般情况下,避免使用许多小文件,例如十万个千字节大小的文件。喜欢更少但更大的文件(但如果可能的话,请避免巨大的文件大小,例如太字节或大于最大磁盘或分区的一半;但请参阅LVM)。
也许像GDBM这样的索引文件库是值得的。
如果您需要拥有大量文件,请将它们放在子目录中:因此dir01/subdir02/file0345.txt
优于file01020345.txt
;避免使用大型目录超过一千个文件。 (请参阅有关Ext2的wikipage图以了解原因)。
您可能采用混合方法:某些数据库中的内容较小(例如小于兆字节),文件中的内容较大(数据库中包含一些元数据)。另请阅读binary large objects(BLOB)。
定义,实现和测试一些backup和一些恢复(人工)程序。对于(不是巨大的)数据库,以文本格式(例如SQL)转储它。
因此,您的工作应首先估算数据的大小,以及访问(和更改)的方式(以及更改频率)。
如果是家庭作业且您不允许使用外部库,则应将文件组织成固定大小记录(随机访问,例如使用fseek(3)或lseek(2) ) - 可能编码为一些tagged union并关心索引(使用例如hash-tables或B-tree技术)。您可能需要管理几个低级别记录的linked lists来处理大数据。
研究 sqlite 或 GDBM 的实现(两者都是free software,你应该下载并研究它们的源代码)将是鼓舞人心的。
请注意,大多数大学只有几十个学生,我想每个学生都需要几个(或十几个)千字节(除非你想存储每个学生的照片或视频!)用于身份,分数和课程信息。所以在实践中你可能只需要几十兆字节(可能是两千兆字节),而今天它只适用于RAM。