目前有這么一個需求:
1.資料庫中有一千萬以上的資料,多表關聯查詢之后會得到檔案在ftp服務上的存盤路徑,
2.現在需要通過這個存盤路徑校驗ftp上的檔案存不存在,若檔案存在,則需要根據檔案型別判斷檔案是否損壞
現在的情況是,一千萬資料回圈請求獲取ftp上的檔案流,然后再用校驗方法,每次回圈內完成獲取流再校驗需要2秒左右,若是單執行緒跑得幾個月,多執行緒跑的話又會記憶體溢位,哪怕把執行緒減少,避免記憶體溢位,依然會跑幾十天,ftp服務上又有連接數限制,只能用URL獲取檔案流,但是跑了一段時間后,URL獲取流越來越慢,不知道大家有沒有好的思路,能大幅的提高效率
//ftp://<用戶名>:<密碼>@<主機名>/檔案URL;type=<FTP型別>
URL url = new URL(new String(fullPath.getBytes("GBK"), "GB2312"));
URLConnection con = url.openConnection();
inputStream = con.getInputStream();
uj5u.com熱心網友回復:
在ftp檔案服務器上跑 校驗,結果提交到檔案或者資料庫uj5u.com熱心網友回復:
檔案校驗使用的是什么方式?如果把檔案 down 下來進行校驗,會相當浪費時間,因為時間大部分花費在下載程序。一般的思路如下:
1、FPT服務器上的檔案有自己的 hash 校驗值可供訪問
2、資料庫中的記錄有相應的 hash 可供使用
3、不將檔案下載下來,而是直接比較二者的 hash 值
uj5u.com熱心網友回復:
ftp服務器是獨立的,客戶不給用,uj5u.com熱心網友回復:
ftp上的檔案很亂很雜,時間跨度有半個世紀,而且以前的操作也不規范,所有現在只有一個檔案的ftp地址是已知的,其他的都沒有,檔案校驗不是下載的完整性校驗,是校驗檔案能不能打開,比如jpg的校驗,通過檔案流讀取圖片的寬度,沒報錯就是好的,否則就是損壞檔案,沒有任何可參考的資料,而且檔案大小不一,幾兆到幾百兆的都有
uj5u.com熱心網友回復:
并發下載同步到一個新服務器上,然后同步做校驗先系統級解決,性能高很多。
1 使用外置硬碟拷貝出來;
2 使用rsync將目錄完整同步出來到一個新服務器(大容量PC上),然后在這個新服務器上跑。
一定要遠程解決:那就使用兩個執行緒池,一個下載執行緒池,一個分析執行緒池。下載執行緒池可以把ftp的IO占滿,分析執行緒池分析檔案并提交檔案狀態
檔案資訊增加幾個欄位,已下載,本地路徑,分析結果,已移除。下載管理回圈的從未下載中獲取若干,分配個作業執行緒。分析管理將已下載檔案資訊交給分析作業執行緒,分析后提交結果(最好再計算個hash并存盤),并移除檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/171406.html
標籤:Java EE
