jFD開発したりしなかったり日誌
2007-09-05 [長年日記]
_ FastFile
ちょっと話題になったんで、Java6を使ってjava.io.FileとFastFileの
パフォーマンスを調べてみた。
指定されたディレクトリのファイル一覧を取得し、その全てに対して名称、
サイズ、種別(ファイルかディレクトリか)、読み込み可否、書き込み可否を
取得する、というコードを書いてみた。
実行結果はディレクトリのファイル数ごとに、
5000ファイル
File→0.6秒
FastFile→0.1秒
10000ファイル
File→1.2秒
FastFile→0.2秒
30000ファイル
File→3.6秒
FastFile→1.4秒
となった。
明らかにFastFileの方が速いのだが、気になるのがFastFileの結果がファイル数に
対して正比例じゃないことか。
昔はFileの結果がファイル数に対して正比例じゃなくて、二乗に比例して遅くなってたが、
それは改善されてるようだ。
_ 実際の
テストコードはこんな感じです。
レイアウトのためにスペースは全角スペースになってますんで悪しからず。
import java.io.*;
import jp.ne.anet.kentkt.fastfile.*;
public class FileListTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
// File dir = new File(args[0]);
File dir = new FastFile(args[0]);
File[] files = dir.listFiles();
FileInfo[] infos = new FileInfo[files.length];
for(int i=0; i<files.length; i++) {
infos[i] = new FileInfo(files[i]);
}
System.out.println(System.currentTimeMillis() - start);
}
static class FileInfo {
String name;
long length;
boolean isFile;
boolean canRead;
boolean canWrite;
FileInfo(File file) {
name = file.getName();
length = file.length();
isFile = file.isFile();
canRead = file.canRead();
canWrite = file.canWrite();
}
}
}
_ 雨
昼飯を食いに、Fさんと会社の近くの某ホテル最上階のレストランへ。
ここは水曜日にカレーバイキングを1000円でやっていて、ちょくちょく食べに行ってる。
東京湾が一望できてなかなか眺めのいいレストランなのだが、いきなり視界が
悪くなったと思ったら、ものすごい大雨になった。
雨が窓ガラスにビタビタと打ちつけ、霧が発生したように遠くが見えなくなった。
Fさんと
「これ、会社戻れますかね・・・」
と言いながら食事してたら、降りはじめと同じくらい急にやんで、普通に帰れるようになり
一安心した。
でもここ最近ごきぶりポーカーのやりすぎで妙に相手の裏を読む癖がついて、
「きっと雨がやんでこれでもう降らないだろう、と思わせておいて表に出たところを
また土砂降りにする気なんですよ!」
あのゲームは人を歪めるなあ。
_ 空手社長とIさんと飲み
仕事後、新橋で空手部長改め空手社長と、以前の同僚だったIさんと飲んだ。
新橋駅に集合し、まずIさんと合流して空手社長を待つ。
さっきの雨のせいで恐ろしく湿度が高く、不快指数は凄まじい。
しばらくして空手社長が現れた。
「どこ行く?」
「とにかくエアコンがキンキンに効いた所をお願いします」
ということで駅前の居酒屋へ。
ちょっと他にめでたい事もあったので、おいしく酒を飲む。
Iさんは仕事が色々大変らしい。
なんだかなあ、な仕事。
そのほかIさんの切なくも美しいストーリーを面白おかしく聞いたり、
今までのどうしようもない仕事のリストアップをしたり。
ひたすらご機嫌で飲んでいた。
- https://www.google.co.jp/ ×23
- http://cappuccino.jp/keisuken/logbook/ ×15
- http://cappuccino.jp/keisuken/logbook/20070906.htm... ×3
- http://cappuccino.ne.jp/keisuken/logbook/ ×1
- http://cappuccino.jp/keisuken/logbook/20070906-3.h... ×1
- http://niwango.jp/mobile/new_search/search_niwango... ×1
- https://www.bing.com/ ×1
- http://www.starseed.ne.jp/ ×1
- http://k-takata.o.oo7.jp/diary/2007-09.html ×1
- http://74.125.153.132/search?q=cache:s3skmLkinYEJ:... ×1
- キーワード不明 ×41 / java fastfile ×5 / fastfile ×3 / FastFile ×3 / findfirstfile パフォーマンス ×3 / migemo java ×2 / ゴキブリポーカー アルゴリズム ×2 / Java File listFiles 大量 ×2 / fastfile java ×2 / java FastFile ×2 / ディレクトリのファイル数 Java ×2 / NTFS FindFirstFile サイズ ×2 / File listFiles 万ファイル ×2 / java.io.File 遅い ×2 / java ファイル一覧取得 遅い ×1 / FindFile ファイル種別 ×1 / FindFirstFile ファイル数 ×1 / listFiles() Java 大量 ×1 / findfirstfile 遅い ×1 / java メモリ コピー ×1 / java File canwrite ×1 / java File listFiles パフォーマンス ×1 / java Fast File ×1 / Java Fast File ×1 / findfirstfile 問題点 ×1 / jp.ne.anet.kentkt.fastfile ×1 / java メモリコピー ×1 / java ディレクトリのファイル数 ×1 / jfd migemo ×1 / df ファイラ migemo ×1 / java file canRead ×1 / java java.io.File パフォーマンス ×1 / java canWrite 欠点 ×1 / listFiles 遅い ×1 / java migemo ×1 / Java listFiles 遅い たくさんのファイル ×1 / listfiles メモリ 大量 java ×1 / java6 canwrite ×1 / Word : ユーチューブ ×1 / java canRead canWrite ×1 / java File ファイル数 ×1 / java file.listfiles 時間がかかる ×1 / java file listfiles 制限 ×1 / FindFirstFile ファイラー ×1 / java ファイル canRead ×1 / FindNextFile ×1 / インクリメンタルサーチ アルゴリズム ×1 / FindFirstFile Disk IO ×1 / file listFiles パフォーマンス ×1 / NTFS Java File canRead ×1 / listFiles() パフォーマンス ×1 / FastFile java ×1 / 空手 社長 ×1 / File.listFiles パフォーマンス ×1 / java File メモリ領域 ×1 / java ディレクトリ canwrite ×1 / file listfiles メモリ ×1 / java file canwrite ×1 / File listFiles ファイル数 ×1 / FindFirstFile ×1 / java6 isFile ×1 / canWrite 日本語 File ×1 / java canRead NTFS とは ×1 / java static canRead ×1 / 数万 大量のファイル findfirstfile ×1 / FastFile オブジェクト ×1 / canExecute() Java File ×1 / jFD ファイル java ×1 / java windows canwrite file ×1 / java file listFiles 大量 ×1 / java canwrite NTFS ×1 / java ファイラー ×1 / 不快指数 湿度 import java ×1 / java.io.File canRead 遅い ×1 / インクリメントサーチ アルゴリズム ×1 / ホモヌ-ド ×1 / FileInfo 遅い ×1 / canWrite java NTFS ×1 / java FastFileパフォーマンス ×1 / java6 I/O 遅い ×1 / java canRead() テスト ×1 / File#canRead/canWrite ×1 / canWrite java6 ×1 / FastFile JAVA ×1 / shunji jfd ×1 / java メモリ 後ろ 遅い ×1 / ファイラ migemo 一覧 ×1 / java FileInfo ファイルサイズ ×1 / FindFirstFile FindNextFile パフォーマンス ×1 / java.io.File ファイル数 大量 ×1 / java file listFIles パフォーマンス ×1 / java File canRead ×1 / ファイル一覧 FastFile ×1 / java io File canExecute ×1 / findfirstfile 遅く ×1 / SpringM ×1 / FindFirstFile 大量のファイル メモリ ×1 / java File canread 遅い ×1
>気になるのがFastFileの結果がファイル数に
>対して正比例じゃないことか。
メモリ管理方法による問題かも知れません。FastFile.dllはファイル名と属性の一覧をすべてメモリに読み込んでから、FastFile[]に変換して結果を返しています。一覧を読み込むためのメモリ領域は、最初に1024ファイル分確保し、足りなくなると以降1024ファイル分ずつ増やしていきます。増やす際に、領域をそのまま伸張できればいいのですが、後ろに空きがないと大量のメモリコピーが・・・。倍々で増やすようにすると改善されるかもと考えています。
(ちなみに1ファイルの情報は600バイト弱あるので、3万ファイルだと約18MB・・・アルゴリズムの見直しが必要かも?)
メモリ確保/コピーがその程度のオーバヘッドになるか、というとディスクI/Oのほうが圧倒的に遅いのであまり影響は無いのでは。
ファイルシステム側の先読み機能との相性なんかも気になります。
DFでは「たくさんあるところにはたくさんある」という法則の下、倍々に増やしていっています。
>>K.Takataさん
気が向いたら改良ご検討ください。
今のままでも普段はあまり困らないんですが、弱点が減ると嬉しいですね。
>>びいさん
ふーむ。
Javaでファイラー書いてると、けっこうそういうこと考えなくなっちゃうもんで参考になります。
FileListTestを使って計測してみました。こちらでも3万ファイル、FastFileで約1.0秒と同じような傾向でした。倍々で増やすようにしたところ、約0.4秒に改善されました。
この内、FindFirstFile()/FindNextFile()を使ってファイルの一覧を取得するのに掛かる時間は50ms程度のようです。やはり、MB単位のメモリの確保・コピーに掛かる時間は馬鹿にできません。
後は3万個のFastFileオブジェクトの生成と、配列への格納に掛かる時間が、0.2秒程度でした。
メモリ確保、コピーの時間が約4分の1、というわけですか。
差は大きいですね。
ためになりますよ。
結局大量のメモリ確保をやめることで、0.3秒以下となり、File.listFiles() と同等の時間で属性も取得できるようになりました。ついでに Java 6 に対応してみました。ただ、実のところ、canRead(), canWrite(), canExecute() にはちょっと問題があったり。
インクリメンタルサーチは、最近になって自分の使っているファイラーに実装しましたが便利です。
ttp://homepage3.nifty.com/k-takata/mysoft/springm.html
日本語ファイル名を使うときは、migemo が使えると非常に便利です。数百のファイルの中から一瞬で目的のファイルにカーソルが移動するのは感動します。Java には migemo はまだ移植されてないのでしたっけ?
おお、いい感じですね。
是非公開してください。
お願いします。
migemo導入は前々からしたいとは思っていたんですが、今のところJava実装は無いですね。
そろそろ誰かやらないのかな、と思ってたんですが話を聞きません。
自分でやるしかないかなあ・・・
FastFileの新バージョンは既に公開しています。NTFSでの問題点については日記に書いておきました。
さっそくダウンロードしました。
これからjFD2に組み込んでみますね。