Performance
確定文件是否為 SQLite 數據庫的快速方法
我正在尋找一種方法來確定包含數千個文件的文件夾中的文件類型。文件名不透露太多,也沒有副檔名,但類型不同。具體來說,我試圖確定一個文件是否是一個 sqlite 數據庫。
使用
file
命令時,每秒判斷2-3個文件的類型。這似乎是解決問題的好方法,只是它太慢了。然後我嘗試用 sqlite3 打開每個文件並檢查是否出現錯誤。這樣,我每秒可以檢查 4-5 個文件。好多了,但我認為可能有更好的方法來做到這一點。
每秒測試 2-3 個文件
file
對我來說似乎很慢。file
實際上執行了許多不同的測試來嘗試確定文件類型。由於您正在尋找一種特定類型的文件(sqlite),並且您不關心辨識所有其他文件,因此您可以對已知的 sqlite 文件進行試驗以確定哪個測試實際辨識它。然後,您可以使用該-e
標誌排除其他人,並針對您的完整文件集執行。請參閱手冊頁:-e, --exclude testname Exclude the test named in testname from the list of tests made to determine the file type. Valid test names are: apptype EMX application type (only on EMX). text Various types of text files (this test will try to guess the text encoding, irrespective of the setting of the ‘encoding’ option). encoding Different text encodings for soft magic tests. tokens Looks for known tokens inside text files. cdf Prints details of Compound Document Files. compress Checks for, and looks inside, compressed files. elf Prints ELF file details. soft Consults magic files. tar Examines tar files.
*編輯:*我自己嘗試了一些測試。概括:
- 使用正確的標誌應用我的建議可以加快
file
大約 15% 的速度,以便測試確定 sqlite。這是什麼,但不是我預期的巨大改進。- 你的文件測試真的很慢。在你做 2-3 的時候,我在標準機器上做了 500 個。您是在慢速硬體上,還是在檢查巨大的文件,在執行舊版本的
file
,或者…?- 您必須保留“軟”測試才能成功將文件辨識為 sqlite。
對於一個 16MB 的 sqlite DB 文件,我做了:
#!/bin/bash for i in {1..1000} do file sqllite_file.db | tail > out done
命令行計時:
~/tmp$ time ./test_file_times.sh; cat out real 0m2.424s user 0m0.040s sys 0m0.288s sqllite_file.db: SQLite 3.x database
嘗試不同的測試排除,並假設確定是基於單個測試,它是辨識文件的“軟”(即魔術文件查找)測試。因此,我修改了
file
命令以排除所有其他測試:file -e apptype -e ascii -e encoding -e tokens -e cdf -e compress -e elf -e tar sqllite_file.db | tail > out
執行 1000 次:
~/tmp$ time ./test_file_times.sh; cat out real 0m2.119s user 0m0.060s sys 0m0.280s sqllite_file.db: SQLite 3.x database