1

私はJavaでプログラミングしています。特定のフォルダ内のすべてのファイルのサイズを定期的にカウントしたい。期間は一定ではなく、非常に短いです。私のコードは次のとおりです。

//get Index Size
index_byte_size = 0;
File index = new File(indexPath);
String[] files = index.list();
File f = null;
for(int i=0; i < files.length; i++) {
    f = new File(index, files[i]);
    index_byte_size += f.length();
}

index_byte_size私が欲しいものです。indexPathフォルダのパスです。

コードはループしています。そして、index_byte_sizeループごとに合計を出力します。私の知る限り、ファイルサイズは継続的に増加するはずです。ただし、得られる結果は次のようになります。

IndexSize(byte) Time(ms)
0   297
0   802
0   1293
0   1710
7769547 2952
7769547 4330
7769547 4431
7769547 4785
7769547 4901
7769547 5213
7769547 5279
7769547 5446
7769547 5660
7769547 5861
7769547 6155
24041054    8763
24041054    9203
24041054    10439
24041054    10820
24041054    11685
36708630    13662
36708630    14309
36708630    16065
36708630    16192
36708630    16374
36708630    16691
36708630    16899
...

ご覧のとおり、ファイルサイズは増加し、一定に保たれ、その後増加します。何が起こっているのかわかりません。オペレーティングシステムで何かが起こっていると思います。私のOSはWindows7です。


[バックグラウンド]

Luceneを使って実験を行い、そのインデックス作成能力、特にインデックスサイズとインデックス作成効率を確認したいと思います。

私はたくさんの小さなテキストファイルを持っています(それぞれ2-10Mサイズ)。そして、Luceneがそれぞれに1つずつインデックスを付けるのにかかる時間と、インデックスの大きさを確認したいと思います。だから私はこのプログラムを書きます。

インデックスが変更されたときに通知を受けたくありません(もちろんインデックスが変更されるため)。私は、彼らが非常に短い期間でどれくらいの期間、どれくらいの大きさであるかを知るために何をすべきかを知っています。


誰かが理由を知っていますか?そして、どうすればリアルタイムでサイズを正確に数えることができますか?

4

1 に答える 1

2

アプリケーションが出力をバッファリングし、データをまとめてプッシュするのは一般的です。

ここではそうではないと思います。代わりに、Luceneがメモリマップトファイルを使用しているのではないかと思います。メモリマップトファイルを拡張すると、割り当てを行うたびにファイルが拡張されます。割り当てには費用がかかりますが、必要以上に割り当てるコストはかなり安くなります(仮想メモリを使用し、タッチするとメインメモリとディスクのみを使用するため)最も効率的な方法は、大きなブロックを割り当ててからそれらを埋めることです。怠惰にアップ。(たとえば、64ビットJVMで一度に128 MBを割り当てます)

File.lengthは、実際に使用された量や使用されたディスク容量ではなく、ファイルの範囲を示します。UNIXで使用されているディスク容量duと、Java 7の一部のツールで使用されている容量を確認できます(ファイルではなく、ファイルシステムのルートに使用されている容量のみが見つかりました)

それでも、これは何ページがタッチされたかを示します。使用量を正確に知る唯一の方法は、ファイルを読み取ることです。これは、ファイルの読み取り中にファイルが変更されている場合、精度が制限されます。

編集:Windows 7では、スペースはすぐに予約されているように見えるため、ファイルシステムのサイズよりも大きいスパースファイルを作成することはできません(ext4ファイルシステムの場合のように)

于 2012-12-19T13:57:30.100 に答える