使用单个大数据文件还是使用大量小数据文件更好——哪个更快?
Is it better to use a single large data file or lots of small data files — which is faster?
我想做一个程序来记录大学的学生并提供一种搜索方法。
以下哪种方法会更快?
为每个学生制作一个文件
制作单个数据文件并搜索?
不同学生的学生数据大小会有所不同。
它是 operating system and file system specific. Some general hints (with an implicit focus on Linux systems, with good enough file systems like Ext4, BTRFS,等等...)。
考虑使用 database, perhaps just Sqlite, or a DBMS like PostGreSQL or MongoDB (indexing 对性能至关重要)
您的问题取决于数据大小。如果您确定它足够小以轻松装入 RAM(例如,在最近的笔记本电脑或台式机上小于 100 兆字节),您可以 serialize and deserialize all the data using some textual format like JSON。相反,如果您确定自己拥有数据中心大小的数据(数 PB),则情况 非常 不同。
一般来说,避免有很多小文件,例如数十万千字节大小的文件。更喜欢拥有更少但更大的文件(但如果可能,请避免 巨大 文件大小,例如 TB 或大于最大磁盘或分区的一半;但是请参见 LVM)。
也许像 GDBM 这样的索引文件库是值得的。
如果你需要有很多文件,把它们放在子目录中:所以dir01/subdir02/file0345.txt
比file01020345.txt
好;避免使用大目录,例如一千多个文件。 (请参阅维基页面上关于 Ext2 的图以了解原因)。
您可能采用混合方法:一些数据库中的小内容(例如小于兆字节),文件中的大内容(数据库中有一些元数据)。另请阅读 binary large objects(BLOB)。
另请参阅 application checkpointing or persistence
定义、实施和测试一些backup和一些恢复(人类)程序。对于(不是很大的)数据库,将其转储为文本格式(例如 SQL)。
因此您的工作应该从估计数据的大小以及访问(和更改)的方式(以及频率)开始。
如果是家庭作业,并且不允许使用外部库,则应将文件组织成 固定大小 记录(随机访问,例如 fseek(3) or lseek(2)) - probably coded as some tagged union and care about indexing (using e.g. hash-tables or B-tree techniques). You might need to manage linked lists几个低级记录来处理大数据。
研究sqlite或GDBM的实现(两者都是free software,你应该下载并研究它们的源代码) 将是鼓舞人心的。
请注意,大多数大学只有几十万学生,我估计每个学生都需要几(或十几)千字节(除非你想存储照片或视频)每个学生!)以获取身份、分数和课程信息。所以在实践中你可能只需要几十兆字节(可能是两千兆字节),这适合今天的 RAM。
我想做一个程序来记录大学的学生并提供一种搜索方法。 以下哪种方法会更快?
为每个学生制作一个文件
制作单个数据文件并搜索?
不同学生的学生数据大小会有所不同。
它是 operating system and file system specific. Some general hints (with an implicit focus on Linux systems, with good enough file systems like Ext4, BTRFS,等等...)。
考虑使用 database, perhaps just Sqlite, or a DBMS like PostGreSQL or MongoDB (indexing 对性能至关重要)
您的问题取决于数据大小。如果您确定它足够小以轻松装入 RAM(例如,在最近的笔记本电脑或台式机上小于 100 兆字节),您可以 serialize and deserialize all the data using some textual format like JSON。相反,如果您确定自己拥有数据中心大小的数据(数 PB),则情况 非常 不同。
一般来说,避免有很多小文件,例如数十万千字节大小的文件。更喜欢拥有更少但更大的文件(但如果可能,请避免 巨大 文件大小,例如 TB 或大于最大磁盘或分区的一半;但是请参见 LVM)。
也许像 GDBM 这样的索引文件库是值得的。
如果你需要有很多文件,把它们放在子目录中:所以
dir01/subdir02/file0345.txt
比file01020345.txt
好;避免使用大目录,例如一千多个文件。 (请参阅维基页面上关于 Ext2 的图以了解原因)。您可能采用混合方法:一些数据库中的小内容(例如小于兆字节),文件中的大内容(数据库中有一些元数据)。另请阅读 binary large objects(BLOB)。
另请参阅 application checkpointing or persistence
定义、实施和测试一些backup和一些恢复(人类)程序。对于(不是很大的)数据库,将其转储为文本格式(例如 SQL)。
因此您的工作应该从估计数据的大小以及访问(和更改)的方式(以及频率)开始。
如果是家庭作业,并且不允许使用外部库,则应将文件组织成 固定大小 记录(随机访问,例如 fseek(3) or lseek(2)) - probably coded as some tagged union and care about indexing (using e.g. hash-tables or B-tree techniques). You might need to manage linked lists几个低级记录来处理大数据。
研究sqlite或GDBM的实现(两者都是free software,你应该下载并研究它们的源代码) 将是鼓舞人心的。
请注意,大多数大学只有几十万学生,我估计每个学生都需要几(或十几)千字节(除非你想存储照片或视频)每个学生!)以获取身份、分数和课程信息。所以在实践中你可能只需要几十兆字节(可能是两千兆字节),这适合今天的 RAM。