2009-12-15 25 views
5

假設我想獲取由lstat()系統調用返回的文件的幾個屬性(所有者,大小,權限,次數)。在Java中執行此操作的一種方法是創建一個java.io.File對象,並對其執行諸如length(),lastModified()等調用。我有兩個問題至今:用於Java的Unix stat()/ lstat()

  1. 這些調用中的每一個觸發的stat()調用,併爲我的目的STAT()s被認爲昂貴的:我試圖掃描數十億個文件的並行上數百臺主機和(到第一次近似)訪問這些文件的唯一方法是通過NFS,通常針對加載了stat()的文件集羣可能需要半秒鐘的時間。調用不是lstat(),它通常是stat()(它遵循符號鏈接)或fstat64()(它打開文件並可能觸發寫操作來記錄訪問時間)。

有沒有一種「正確」的方式來做到這一點,這樣我最終只做一個lstat()調用並訪問struct stat的成員?我從谷歌搜索迄今發現:

  • JDK 7將在java.nio.file的一切我想要的PosixFileAttributes接口(但如果我可以,我寧願不進行夜間運行構建我的JDK躲開它)。

  • 我可以用JNI或JNA推出我自己的界面(但是如果存在現有界面,我寧願不要)。

A previous similar question得到了幾個建議的JNI/JNA實現。一個消失了,另一個維護得可疑(例如,沒有下載,只是一個hg存儲庫)。

那裏有更好的選擇嗎?

回答

2

看起來你幾乎覆蓋了所有的基地。當我開始閱讀你的問題時,我首先想到的是JDK 7或JNI。在不瞭解這些文件的變化模式的任何信息的情況下,您可能還會考慮某種持久性緩存,例如嵌入式數據庫。除NFS之外,您還可以查看其他一些訪問方法,例如從遠程主機提供批量文件信息的自定義Web服務。

+0

謝謝!最終我猜JDK 7並不是那麼糟糕;我可以使用我正在編寫的工具保留二進制文件,並且很快就會生成級別的軟件。 – 2009-12-16 13:34:57

1

是的,stat()在所有調用和庫下。這是一個延遲問題。但是,你可以同時執行多個stat(),因爲有很多NFS服務器守護程序來支持你的連接,除非有人有一個異步stat(),否則使用線程。如果你可以通過ssh獲得主機,stat()會便宜得多。你甚至可以編寫一個tcp服務在路徑中流式傳輸並傳出stat()。不幸的是,訪問NFS服務器是困難的或不可能的,因爲它可能只有管理員帳戶,成爲Hitachi SAN或其他東西。

+0

有一點歷史背景:有問題的NFS服務器是一個5-10PB的Isilon羣集,它在stat調用時提供了嚴格的一致性,但是以爭用時的可怕延遲爲代價。 (我還不確定他們是否擁有一個大鎖或更復雜的東西。)這是一個文件系統級別的問題:我們沒有做任何更好的root操作。我們最終只是讓它花費時間,而不是花幾天的時間試圖節省幾天的計算機時間。 – 2016-12-30 03:53:00