2009-12-15 19 views
5

lstat() sistem çağrısı tarafından döndürülen bir dosyanın birkaç özelliğini (sahibi, boyutu, izinleri, süreleri) almak istiyorum. Java'da bunu yapmanın bir yolu, bir java.io.File nesnesi oluşturmak ve üzerinde length(), lastModified(), vb. Gibi aramalar yapmaktır.Java için Unix stat()/lstat()

  1. bu aramaların Her biri stat() çağrısını tetikler ve benim amaçları stat() ler pahalı kabul edilir: ben paralel olarak dosyaların milyarlarca taramak için çalışıyorum şimdiye kadar iki sorun var yüzlerce ana bilgisayar ve (bir ilk yaklaşıma kadar) bu dosyalara erişmenin tek yolu NFS aracılığıyla, genellikle yük altında stat() yükünün yarım saniye sürdüğü bölme kümelerine karşıdır.

  2. Arama lstat() değil, normalde stat() (hangisini izler) veya fstat64() (dosyayı açar ve erişim süresini kaydetmek için bir yazma işlemi başlatır).

bunu yapmak için "doğru" yolu sadece() çağrısını tek lstat yapıyor ve struct stat üyelerini erişen sona öyle ki, var mı?

  • JDK 7 İstediğim her şeyi java.nio.file içinde PosixFileAttributes arayüzüne sahip (ama eğer yapabilirsem ben daha çok gece çalışıyor olması istemem benim JDK kurar olacaktır: Ne Googling gelen ana kadar bulduk Bunu önlemek).

  • Kendi arayüzümü JNI veya JNA ile yürütebilirim (ancak varolan bir tanesini kullanmamayı tercih ederim). Bir previous similar question

önerilen JNI'yı/JNA uygulamaların bir çift var. Biri gitti ve diğeri şüphesiz korunur (örneğin, indirmeler, sadece bir hg deposu).

Orada daha iyi seçenekler var mı?

cevap

2

Görünüşe göre tüm üsleri kaplamışsınızdır. Sorunuzu okumaya başladığımda ilk düşüncem JDK 7 veya JNI idi. Bu dosyalardaki değişiklik kalıbı hakkında bir şey bilmeden, gömülü bir DB gibi, söz konusu bilgilerin bir çeşit kalıcı önbelleğini de inceleyebilirsiniz. Ayrıca, uzak bir ana bilgisayardan toplu dosya bilgisi sağlayan özel bir web hizmeti gibi NFS'nin yanı sıra başka bir erişim yöntemine de bakabilirsiniz.

+0

Teşekkürler! Nihayetinde JDK 7'nin çok kötü olmadığını sanırım; Ben ikili dosyaları sadece yazdığım araçla koruyabilirim, ve yakında üretim sınıfı bir yazılım olacak. Biraz tarihsel arka plan için –

1

Evet, stat() tüm aramaların ve kitaplıkların altında. Bu bir gecikme problemidir. Ancak, çok fazla stat() 'yi bir kerede yapabilirsiniz, çünkü bağlantılarınızı destekleyen çok sayıda NFS sunucusu sunucusu vardır; Eğer ev sahibi olabilir, ssh gibi, stat() çok daha ucuz olurdu. Yollarda akış yapmak ve stat() akışını gerçekleştirmek için bir tcp hizmeti bile yazabilirsiniz. Ne yazık ki, NFS sunucusuna erişim zor veya imkansızdır, çünkü sadece yönetici hesaplarına sahip olabilir, bir Hitachi SAN veya bir şey olabilir.

+0

: Söz konusu NFS sunucuları istatistik çağrılarda ama çekişme altında korkunç gecikme pahasına sıkı tutarlılık sağlanan bir 5-10PB Isilon küme idi. (Hala büyük bir kilit ya da daha karmaşık bir şey olup olmadığından emin değilim.) Bu dosya sistemi düzeyinde bir sorun oldu: biz root olarak daha iyi sshed yapmadık. Sadece birkaç gün bilgisayar zamanını kurtarmaya çalışan birkaç gün insanı harcamak yerine zamanını almasına izin verdik. –