我想製作一個程序來保存大學學生的記錄並提供搜索方法。 以下哪種方法會更快?使用單個大型數據文件還是使用大量小型數據文件會更好?
製作一個文件爲每位學生
使單個數據文件和搜索?
不同學生的學生數據大小會有所不同。
我想製作一個程序來保存大學學生的記錄並提供搜索方法。 以下哪種方法會更快?使用單個大型數據文件還是使用大量小型數據文件會更好?
製作一個文件爲每位學生
使單個數據文件和搜索?
不同學生的學生數據大小會有所不同。
它是operating system和file system具體。一些一般提示(暗含Linux系統的重點,具有足夠好的文件系統,如Ext4,BTRFS等)。
考慮使用database,或許只是Sqlite或DBMS像PostGreSQL或MongoDB(indexing是性能的關鍵)
你的問題取決於數據的大小。如果您確定它足夠小,可以輕鬆裝入內存(例如,最近的筆記本電腦或臺式機上不到一百兆字節),那麼您可以使用並使用一些文本格式(如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,你應該下載並研究它們的源代碼)的實施將是鼓舞人心的。
請注意,大多數大學只有幾十個學生,我想每個學生都需要幾個(或幾十個)千字節(除非您想存儲每個學生的照片或視頻!)身份,分數和課程信息。所以在實踐中,你可能只需要幾十兆字節(也許是2千兆字節),這在今天適用於RAM。
打開文件是一個相對緩慢的過程。擁有大量文件而不是單個文件可能會比較慢,除非您能夠根據您的查詢按名稱訪問正確的文件。對於搜索代碼,您可能會發現多個文件運行良好。但是,在列出大學所有學生時,多個文件會變成一場災難(特別是如果名稱是散列且您需要按名稱排序順序顯示數據)。這是一個權衡的遊戲。真正的數據庫管理系統和數據管理軟件包相當不錯 - 但有很多代碼可以實現這一目標。 –
如果是作業,你應該告訴你,你應該解釋哪些操作系統,使用哪種語言,你可以使用額外的庫。在所有情況下編輯你的問題來改善它。 –
回答「哪個更快」的問題的正常方法是實現並測試兩者並進行比較。 –