2016-11-21 20 views
6

私は次の問題があります。 APIを使用してデータを入力ストリームとして取得する場所に接続しています。 重複する行を削除した後にデータを保存することを目標としています。 列10,15,22で定義された重複。大規模データのJavaで重複を削除する

私はいくつかのスレッドを使用してデータを取得しています。 現在、私はまずcsvファイルにデータを保存し、次に重複を削除します。 私はデータを読んでいる間にそれをしたい。 データ量は約1,000万レコードです。 私は使用できるメモリが限られています。 マシンには32GBのメモリが搭載されていますが、それを使用する他のアプリケーションがあるため、私は限られています。

ここでは、ハッシュマップの使用について説明します。 しかし、私はそれを使用するのに十分なメモリがあるかどうかはわかりません。

この問題を解決する方法はありますか?

+1

APIからの出力例がありますか?また、3つの列(10,15,22)の組み合わせによって定義された複製、またはこれらの各列は、他の列を参照することなく一意でなければなりませんか? –

+0

apiの出力は、約30要素の = "banna"、= "orange"、 "apple"などのような文字列です。 これらの列の組み合わせがキーです。 – mikeP

答えて

0

ConcurrentHashSetを使用できます。それは自動的に重複した要素を削除し、一定の限界までスレッドセーフです。

+0

メモリ制限は何ですか? 私は持っているデータの量を扱うのですか? – mikeP

1

ハッシュマップは、少なくとも生データと同じだけのメモリを使います。したがって、おそらくデータセットのサイズには適していません(ただし、それが最も簡単なオプションなので、確認する必要があります)。

ファイルやデータベースにデータを書き込み、重複除外するフィールドのハッシュ値を計算し、ファイルに適切な参照を付けてメモリに保存します(たとえば、元の値は書き込まれたファイルにあります)。もちろん、リファレンスはできるだけ小さくする必要があります。

ハッシュマッチにヒットしたときは、元の値を調べ、一致しているかどうかをチェックします(異なる値のハッシュが混在する可能性があるため)。

質問は、あなたが予想している重複数です。一致がほとんど見込まれない場合は、値段の安い読み取りソリューションを選択します。つまり、すべてをフラットファイルにリニアにダンプし、そのファイルから読み戻します。

多くの一致が予想される場合は、インデックスされたファイルやファイルセット、またはデータベース(書き込み操作が高すぎないデータベースであることを確認してください)を使用するのとは別の方法です。

+0

私はキーをハッシュしてリスト(またはlinkedList)に挿入し、もしハッシュが存在すればリストをチェックして、ターゲットファイルに直接書き込むでしょうし、存在すれば私は無視するでしょうか? 私は約200万のユニークなレコードを持っていることを除いて。 – mikeP

+0

@lexicoreに言及したように、ハッシュの衝突がある可能性があります。つまり、2つの異なる値が同じハッシュを持つ可能性があります。ハッシュの衝突を避けるために特別なハッシュ関数を使用することができれば、記述したことを行うことができます。さもなければ、同じハッシュを見つけたら、実際の基礎となる値を比較する必要があります。 例外は、いくつかの一意のエントリを除外することが許容されるユースケースです(むしろ珍しいシナリオ)。 –

1

ソリューションは、列10、15でデータ、大きすぎる(例えば、約1キロバイトの)あなたが実際のインメモリソリューションを実装することができていないことを想定すると、22

でどのように大きなに依存します。

  • 慎重equalshashCode方法を実現22、カラム10、15からの値を格納するKeyクラスを実装します。 (普通のArrayListでもかまいません)
  • 読み取ったすべてのレコードのキーを含むSetを作成します。
  • 読み取った各レコードについて、キーが既にそのセットに入っているかどうかを確認します。はいの場合は、レコードをスキップします。そうでない場合は、レコードを出力に書き込んで、キーをセットに追加します。スレッドセーフな方法でsetを使って作業することを確認してください。

最悪の場合、メモリ量はnumber of records * size of keyです。10000000件のレコードと、鍵当たり1kbの<と仮定すると、これは約10GBで動作するはずです。

キーサイズがまだ大きすぎる場合は、キーのセットを格納するデータベースが必要になることがあります。

もう一つの選択肢は、フルキーの代わりにキーのハッシュを保存することです。これにより、メモリが大幅に少なくなりますが、ハッシュの衝突が発生する可能性があります。これは、「偽陽性」、すなわち実際には重複しない偽の重複につながる可能性がある。これを完全に避けるには、データベースが必要です。

関連する問題