3

既に存在するファイルの内容を上書きしようとしています。明らかに、この回答に従って、古いファイルを上書きする新しいファイルを作成することもできます。ただし、これを潜在的にかなりの回数実行するプログラムを作成しているため、不必要なオーバーヘッドをできるだけ削減したいと考えています。

私の質問は、古いファイルを置き換える「新しい」ファイルを作成するのではなく、ファイル自体の内容を単純に書き換えるより良い方法はありますか? それとも、ファイルの内容全体を単純に上書きするオーバーヘッドは、新しいファイルを作成してから書き込むオーバーヘッドとほぼ同じですか? (記録として、これらのファイルのサイズはわずか 1 KB です。)

4

3 に答える 3

4

簡単に言えば、プロファイルとプロファイルの両方を書きます。

かなり手を振っている長い答え:

ファイルの上書きには、次のシステム コールが含まれます。

open
write
close

新しいファイルの作成、古いファイルの削除、および新しいファイルの名前の変更には、次のシステム コールが含まれます。

open
write
close
unlink
rename

システム コールは、多くの場合、プログラムの最も遅い部分です。一般に、システム コールを減らすことは、プログラムを高速化する良い方法です。1 つのファイルを上書きすると、オペレーティング システムの内部ディレクトリ エントリ データが再利用されます。これはおそらく速度の改善にもつながるでしょう。(VM オーバーヘッドのある言語では測定が難しい場合があります...)

write()1 回の書き込みで 1K 全体を更新すると仮定すると、ファイルは十分に小さく、それぞれをアトミックに処理する必要があります。(パフォーマンスを気にするので、これは安全な仮定のようです。)これは、壊滅的な電源障害と損失の多いマウントオプションの場合を除いて、他のプロセスが部分的な書き込みを見てはならないことを意味します. (一般的ではありません。)ファイルの名前変更アプローチは、複数の書き込みに直面しても一貫したファイルを提供します。

ただし、1K ファイルはかなり非効率的なストレージ メカニズムです。多くのファイルシステムは、4k ブロックに沿ってファイルを書き込みます。これらのデータ ブロックがアプリケーションにのみ存在する場合は、一度にいくつかのコンテナーに書き込むことが理にかなっている場合があります。(巨大なストリーミング IO リクエストは、何千もの小さな IO リクエストよりもはるかに高速であるため、Quake 派生システムは、マップ、テクスチャなどを zip ファイルから読み取るためにこれを行います。) もちろん、アプリケーションが書き込みを行っている場合、これは困難です。これらのファイルを他のアプリケーションで使用できるようにしますが、ファイルがめったに共有されない場合は調査する価値があるかもしれません。

于 2012-06-28T22:47:42.890 に答える
1

ここで使用できるRandomAccessFile短いサンプルは次のとおりです。

         // create a new RandomAccessFile with filename test
     RandomAccessFile raf = new RandomAccessFile("c:/test.txt", "rw");

     // write something in the file
     raf.writeUTF("Hello World");

     // set the file pointer at 0 position
     raf.seek(0);

     // print the string
     System.out.println("" + raf.readUTF());

     // print current length
     System.out.println("" + raf.length());

     // set the file length to 30
     raf.setLength(30);

     // print the new length
     System.out.println("" + raf.length());
于 2012-06-28T22:54:32.970 に答える
0

リンクされた回答の例として使用してください。OS/ファイルシステムに inode のリンク解除/リンク、ディスク上の場所などを心配させてください。最近では、大部分のソフトウェア開発でそれを心配する正当な理由はほとんどありません。

一般に、CPU/ディスク i/o によって抑えられないほどのオーバーヘッドはほとんどありません。ディスク I/O が気になる場合は、メモリ ファイルシステム (クラッシュ時にファイルを保持する必要がない場合) または SATA3 の非常に高速な SSD を使用してください。

于 2012-06-28T22:42:16.713 に答える