0

単語のリストをファイルに書き込んでから、ファイルをディスクに保存する必要があります。次の2つの方法のいずれかが他よりも優れていますか?2つ目は明らかにより多くのメインメモリを使用しますが、速度に違いはありますか?

(これは単なる擬似コードです)

for i = 0 to i = n:
    word = generateWord();
    FileWriter.println(word);
end loop

String [] listOfWords = new List
for i = 0 to i = n:
    word = generateWord();
    listOfWords.add(word)
end loop
for i = 0 to n:
    FileWriter.println(listOfWords[i]);
end loop
4

3 に答える 3

2

あなたが示すこれら2つの方法は、ディスク使用効率の点でまったく同じです。

ディスクの書き込み速度について考えるときは、使用しているライター オブジェクトの種類を常に考慮する必要があります。ライター オブジェクトには多くの種類があり、実際のディスク書き込みに関しては、それぞれが異なる動作をする場合があります。

使用しているオブジェクトが、指定したとおりのデータを書き込むオブジェクトの 1 つである場合、その書き込み方法は非常に非効率的です。書き込む前に、別のライター (BufferedWriter など) に切り替えるか、より長い文字列を作成することを検討する必要があります。

一般に、ディスクのチャンク サイズに適合するチャンクでデータを書き込むようにしてください。

于 2013-01-18T10:16:37.737 に答える
1

コードとディスクの間には、Java ライブラリ コード、仮想マシン ランタイム、C ランタイム ライブラリ、オペレーティング システム ファイル キャッシュ/仮想メモリ サブシステム、オペレーティング システム I/O スケジューラ、デバイス ドライバ、および物理ディスク ファームウェア。

プロファイリングで問題が発生しない限り、可能な限り単純なことを実行してください。これらのレイヤーのいくつかは、バッファリング、バッチ処理、シーケンシャル書き込みのスケジューリングを処理するように既に調整されています。これらは非常に一般的なユースケースであるためです。

于 2013-01-18T10:23:32.250 に答える
0

s の観点からFileWriterは、両方の例でまったく同じことを行っているため、明らかにファイル I/O に関して違いはありません。そして、あなたが言うように、2 番目の O(N) とは対照的に、最初の空間の複雑さは O(1) です。

于 2013-01-18T10:10:30.287 に答える