0

hyuuge(.csv)ファイルの最初の1万行が必要です。

の素朴な方法

1)リーダーとライターを作成する

2)元のファイル行を1行ずつ読み取る

3)最初の1万行を新しいファイルに書き込む

最速になることはできませんね?

これは私のアプリでは一般的な操作になるので、速度について少し心配していますが、興味があります。

ありがとう。

4

3 に答える 3

3

Javaで高速I/Oを実行する方法はいくつかありますが、特定のケースのベンチマークがなければ、図やアドバイスを引き出すのは難しいです。ベンチマークを試す方法は次のとおりです。

  • バッファサイズが異なる可能性のあるバッファ付きリーダー/ライター
  • メモリ内のファイル全体を読み取り(可能な場合)、メモリ内分割を実行し、すべてを一度に書き込みます
  • NIOファイルAPIを使用したファイルの読み取り/書き込み(チャネルを調べる)
于 2012-09-01T06:19:31.287 に答える
1

10,000行程度の読み取り/書き込みのみを行う場合:

  • ファイルの読み取り/書き込みよりも、新しいJVMの起動に時間がかかる可能性があります。
  • 読み取り/書き込み時間はほんの一瞬である必要があります...それを素朴な方法で行い、
  • コピーアルゴリズムによる全体的なスピードアップは、価値がない可能性があります。

BufferedReader.readLine()そうは言っても、何かを使用して一度に1行を読むよりもうまくいくことができます。

  • ファイルの文字エンコードによっては、BufferedInputStreamと大きなバッファーサイズのBufferedOutputStreamを使用してバイト単位のI / Oを実行すると、パフォーマンスが向上します。ループを記述してバイトを読み取り、条件付きでラインカウンターを更新し、必要な行数をコピーするまでバイトを書き込みます。(これは、バイトを調べることでCRおよび/またはLF文字を検出できることを前提としています。これは、私が知っているすべての文字エンコードに当てはまります。)

  • NIOとByteBuffersを使用すると、メモリ内のコピーの量をさらに減らすことができますが、CR/LFカウントロジックはより複雑になります。

しかし、あなたが尋ねるべき最初の質問は、これを最適化することをわざわざする価値があるかどうかです。

于 2012-09-01T06:33:31.247 に答える
0

線は同じ長さですか。その場合は、RandomAccessFileを使用してxバイトを読み取り、それらのバイトを新しいファイルに書き込むことができます。ただし、かなりメモリを消費する可能性があります。これはもっと速いと思いますが、おそらくベンチマークする価値があります。このソリューションは、固定長の回線に対してのみ機能します

于 2012-09-01T06:31:53.500 に答える