1

大量のデータがあり、それらに対していくつかの操作を実行したいと考えています。重複の削除は、主要な操作の 1 つです。

元。

a,me,123,2631272164
yrw,wq,1237,123712,126128361
yrw,dsfswq,1323237,12xcvcx3712,1sd26128361

これらはファイル内の 3 つのエントリであり、最初の列に基づいて重複を削除したいと考えています。したがって、3行目を削除する必要があります。各行には異なる数の列がある場合がありますが、関心のある列は常に存在します。

インメモリ操作は実行可能ではないようです。

別のオプションは、データをデータベースに保存し、そこから重複を削除することですが、これも簡単な作業ではありません。データをデータベースにダンプして重複を削除するには、どのような設計に従う必要がありますか?

人々はそのような問題に直面し、それを解決したにちがいないと思います。

通常、この問題をどのように解決しますか?

PS: これは面接の質問ではなく、実際の問題と考えてください ;)

4

5 に答える 5

5

キーの数もメモリにロードできない場合は、安定した (順序を維持する) 外部マージ ソートを実行してデータを並べ替えてから、線形スキャンを実行して重複を削除する必要があります。または、外部マージ ソートを変更して、ソートされた実行をマージするときに重複を排除することもできます。

これはインタビューの質問ではないか、効率性/エレガンスは問題ではないように思われるからだと思います(?)。最初のフィールドを主キーとして 1 つのテーブルを作成するハック python スクリプトを作成します。このファイルを解析し、レコードをデータベースに挿入し、挿入を try except ステートメントにラップします。次に、テーブルで select * を実行し、データを解析して、1 行ずつファイルに書き戻します。

于 2012-04-28T06:04:38.977 に答える
2

データベース ルートを下る場合は、csv をデータベースにロードし、「重複キー更新」を使用できます。

mysql の使用:-

  1. データと一致する行を含むテーブルを作成します (id と data の 2 行だけで済む場合があります)。
  2. 次の行に沿って何かを使用してデータをダンプします

    LOAD DATA LOCAL infile "rs.txt" REPLACE INTO TABLE data_table FIELDS TERMINATED BY ',';

  3. その後、重複することなく、データを csv 形式に戻すことができるはずです。

于 2012-04-28T06:28:47.547 に答える
0

元のデータの順序を維持する必要がある場合は、位置とデータのタプルである新しいデータを作成し、重複排除するデータで並べ替えることが賢明な場合があります。データでソートすると、重複除外は (本質的に) 線形スキャンになります。その後、タプルの位置部分でソートして元の順序を再作成し、それを取り除くことができます。

次のデータがあるとします: a、c、a、b

データでソートされた pos/data タプルを使用すると、次のようになります: 0/a、2/a、3/b、1/c

次に、重複を排除し、保持する最初または最後のエントリのいずれかを自明に選択できます (メモリ消費量をもう少し増やして、別のエントリを保持することもできます) と、0/a、3/b、1/c を取得できます。

次に、位置で並べ替えて、a、c、b を取り除きます。

これには、データ セットに対する 3 回の線形スキャンと 2 回の並べ替えステップが含まれます。

于 2012-04-28T12:19:55.593 に答える
0

入力がソートされているか、ソートできる場合は、メモリに 1 つの値を格納するだけで済みます。

r = read_row()
if r is None:
    os.exit()
last = r[0]
write_row(r)
while True:
    r = read_row()
    if r is None:
        os.exit()
    if r[0] != last:
        write_row(r)
        last = r[0]

さもないと:

私がしたいことは、すでに見た最初の列の値のセットを保持し、そのセットにある場合は行を削除することです。

S = set()
while True:
    r = read_row()
    if r is None:
       os.exit()
    if r[0] not in S:
       write_row(r)
       S.add(r[0])

これは、最初の列の値のセットのサイズに比例するメモリのみを使用して、入力をストリーミングします。

于 2012-04-28T06:00:48.273 に答える
0

一意のキーの数がそれほど多くない場合は、単純にこれを行うことができます。
(言語について言及していないため、疑似コード)

Set keySet;

while(not end_of_input_file)
    read line from input file
    if first column is not in keySet
        add first column to keySet
        write line to output file
end while
于 2012-04-28T06:00:57.283 に答える