單台伺服器中如何存放幾千萬張圖片?
01-16
因為Linux的文件系統里的inode數目只有幾百萬個,如果存放幾千萬張圖片該怎麼存放?Mysql可以存圖片,不知道有沒有記錄數目限制?如果存放在Mysql中,這樣要取出該怎麼顯示給用戶?
怎麼會呢?你用啥文件系統?我們的ext4
/dev/sda3 729923584 7億多個inode了。資料庫直接存圖片本身是SB的做法。比較好的方法是存圖片md5,然後通過類似md52url獲取圖片的地址。
至於圖片存放,建議打散,打3級或5級。類似 a/de/df/adedf***************.jpg a/de/df/adedf***************_100.jpg a/de/df/adedf***************_180.jpg 。直接定位。類似md52url的函數,如果加上機器信息就更爽了,路徑直接攜帶機器標示,當然是通過加密轉換後的標示————這樣做的好處是,拿到url,可以直接知道它在哪台機器的哪個路徑,直接定位,爽不?。1.對於文件系統級別存儲圖片的事情,本人不擅長,請諮詢其他人,一般都是藉助一些文件系統,比如淘寶開源的TFS,適合存放小文件
2.對於資料庫是否適合存放文件的事情?答案是:否定的,不要把圖片本身存放在資料庫中,通常做法是把圖片存儲在文件系統中的路徑等信息存放在資料庫,然後根據這個路徑再度出圖片,展示給用戶!
用MongoDB的GridFS,省心。國外的一個StartUp:www.snapjoy.com,就是存儲圖片的應用,後端存儲就是用MongoDB,圖片就是存在GridFS。
@xianhuawei的回答是一種解決方案,但是不一定所有情況下都適合。 比如在上了Redis之類的緩存時,縮減ID以節省內存空間也是非常重要的。另外ID的設置最好和業務相關,比如Instagram為其系統中的圖片設計的ID包含了時間和位置信息,詳見:Instagram 的ID生成策略
沒人提奇藝值分解嗎?用演算法存儲,可以存儲超多超多。
df -hli我這邊的Inodes都是221M了,咋可能就幾百萬。分三級目錄,每個目錄下面存1000個子目錄OR文件,三級下來都可以存十億的數據了。一二級目錄直接被系統cache住了,剩下的IO操作其實還OK
是否可以考慮將文件打包?也就是把若干個小文件合併成一個大文件保存。但是需要加一個中間層,用來把小文件打包,以及在合成的大文件中查找目標圖片的工作。
一般都是用專門的文件系統去存的,幾乎不會存到資料庫中去。
怎麼會只有幾百萬個。。。。ext3 128位元組,ext4 256位元組呢。
推薦閱讀:
※1萬億條數據怎麼存儲和查詢?
※如何把 Web 頁面上抓取下來的海量文本信息從非結構化信息變成結構化信息?
※現在有沒有好的TiDB實踐案例?
※Hbase1.1.2的HTablePool已經被棄用,用什麼來代替HTablePool呢?
※Kaggle的比赛和平时的数据分析有哪些区别?