2010-12-17 7 views
5

シナリオ高価な操作をキャストしていますか?

  • 私は大きなファイル(文字のファイル)を解析しています。たとえば、.csvファイル(正確には私のケースではない)
  • ファイル全体をメモリに保持することはできません。だから、私はバッファ戦略を実装しなければならない。
  • メモリ内に一定数の行を保持するジェネリックハンドラを(Stringsとして)ビルドしたいと考えています。このハンドラは、不要な行を削除しながら、必要に応じて他の行をフェッチします。
  • このハンドラーでは、行をJavaオブジェクトに変換し、それらのオブジェクトの変更を操作するパーサーを構築します。変更が完了すると(オブジェクトの一部のフィールドを更新する)、変更をファイルに保存し直します。

はI必要があります。

  • 代わりの文字列の配列としてバッファを維持するには、私が(単一キャストをやって)オブジェクトとして直接バッファを維持する必要がありますか?または...
  • 私はバッファ上で操作する必要があるたびに、正しいオブジェクトに情報をキャストし、変更を行い、変更をファイルに保存し直してください。逐次操作には補助的なキャストが必要です。

私は物事を単純に保つ必要があります。 提案がありますか?

+1

文字列を他のデータ型に正確にどのようにキャストしていますか? –

+1

あなたはキャストや解析について話していますか? – fortran

+0

これはもっと複雑です。これはStringからのキャストはできません.Interface Rowやその他の実装があります。すべての実装は、オブジェクトを返すコンテナのようなものです。そのオブジェクトをキャストする必要があります。特定のRowでいくつかの変更を行う必要がある場合は、内部メカニズムのキャストが必要です。 –

答えて

8

キャストは、オブジェクトが占有するメモリの量を変更しません。これは、ランタイムタイプを変更するだけです。

これらの操作を行単位で実行できる場合は、ループ内でただちに操作して、1行を読み込みます。

while ((line = reader.readLine()) != null) { 
    line = process(line); 
    writer.println(line); 
} 

このようにして、ファイル全体ではなく、毎回Javaのメモリ内に1行だけで済むようになります。

CSVファイル全体に基づいて操作を行う必要がある場合(つまり、操作がすべて行に依存する場合)、最も効率的なのは、実際のSQLデータベースにCSVファイルをインポートし、 SQLステートメントを使用してデータを変更し、再度CSVファイルにエクスポートします。

3

MappedByteBuffer(NIOから)を使用することをお勧めします。メモリに収まらない大きすぎるファイルを読むことができます。 ファイルの領域のみをメモリにマップします。一度この領域を読み終えたら(最初の10k)、次のファイルをマップします。 メモリ効率が高く、実装が非常に簡単です。

2

のJavaキャスト:

Object a = new String(); 
String b (String) a; 

などは高価ではありません。 - ストリングやその他のタイプをキャストしても問題ありません。

1

あなたの本当の価値は、各行を文字列として読み込むことです。これはJavaではかなり簡単です。それは文字列でいたら、あなたが、その後に動作させることができ、アレイ内の各値のための文字列を持っています

String[] row = parsedRow.split(",");

ザ・で、各カンマで文字列を分割することは簡単です。

+0

あなたの 'split()'呼び出しが '123、" abc、def "、ghi'に対して何をするかを考えてください。 –

+0

@JUST MY正しいオピニオン - 正に注目されていますが、コンマが常に区切り文字であり、決して文字列に含まれないと仮定した私の単純な例では、フリンジケースに入り始めています。 – bakoyaro

関連する問題