fdsaadfasfdsafda
> メモリに乗りきらない大容量csvの重複レコード有無を判別したい。
どのようなデータか不明ですが、重複するようなデータなのですか?

いいえ。本来重複しないはずのデータです。
間違いなく重複がないか検品をする必要があります。
awkを使ってもメモリ不足になりますか?
DBに突っ込んで重複行確認。
あるいは適当な行数でファイル分割してそれぞれをソートし、さらにマージソートで1ファイルに結合。上から順に見ていって同じ値が連続していたら重複 (全部をメモリ上に持たなくてもよい方法)

> レコードが非常に多い場合、リストでも文字列でもメモリに乗りきらない可能性
カラムのボリュームによりますが、
1. レコード毎にSHA1(SHA2)ハッシュを生成
2. ハッシュを(リスト型よりコンパクトで済む)文字列型として結合
3. 連結したハッシュ文字列に対して一致ありなしを確認
ではいかがでしょうか?
質問の例のようにカラムの内容がSHA1ハッシュより短いとかえってかさばりますが、カラムの内容がSHA1ハッシュより長いならSHA1ハッシュ化すれば情報をいくらか集約できます。
「ハッシュでも長すぎる」であれば、ハッシュを前半後半に分割して、簡易的には前半のハッシュだけで検索してもし前半のハッシュが一致するなら別に取っておいてある後半のハッシュも検索--とすれば、一度に検索するデータ量は(前半が一致するまでは)半分まで減らせます。

stackoverflowを見るとmeg_さんのコメントにあるようにawkを使う方法がどれもトップに来ていました。たぶんPythonを使う時点で「メモリを食う」「処理が遅い」のダブルパンチになるのだと思います。
「同一装置の同一時刻のデータ」など重複しているレコードの判断基準は無いのでしょう。これまでいろいろデータを扱ってきましたが、「全カラム同一なら重複」というデータを見たことがありません。

meg_様
awkでも乗り切りません。
swapは完全に使い潰しませんが、全体の8割程度のメモリを喰った後にstat:Dで処理が止まります。
68user様
DBの内部処理は明るくないので恐縮ですが、重複行の確認にレコード分のメモリ必要ないのでしょうか。
ただ、いずれにしても新規システムの導入は不可ですのでDBの利用はできません。
こちらもそこまで明るくありませんが、マージソートはIn-place等除いて要素数分メモリ必要な認識です。
分割した各ファイルはソート可能と思いますが、最終的に1ファイルに結合する際に全件分のメモリ必要ではないでしょうか。
fourteenlength様
ハッシュは私も考えました。
本文の例では単に結合しただけですが、文中の一意な識別子というのがそれです。
ご指摘の通り、Pythonで扱う時点で処理が遅い事案は発生してしまう様です。
awkを使ってもメモリに乗り切りませんでした。
TakaiY様
>...データを見たことがありません。
とのことですが、事実ベースそうなっています。
というか、既に不要なカラムを排除している状態です。
必要なカラムのみを抽出した結果、メモリに乗りきらないサイズのデータになっています。
> DBの内部処理は明るくないので恐縮ですが、重複行の確認にレコード分のメモリ必要ないのでしょうか。
メモリに乗らない分は一時領域であるHDD/SSDなどのストレージを使うのが一般的かと思います。もちろん遅いし、一時領域不足ならエラーになります。
> 分割した各ファイルはソート可能と思いますが、最終的に1ファイルに結合する際に全件分のメモリ必要ではないでしょうか。
試してませんが sort -m *.splitted-and-sorted | uniq -d で重複行出てこないでしょうか。sort -m は各ファイルがソートされている前提なのでファイル全体を溜め込まない。uniq は同じ行が連続していたら出力するだけ。
そもそも GNU sort であればメモリで足りない分は一時ファイルを使ってくれるので、微妙に足りない程度なら -S オプションを適切に使えば分割せずにいけるのかもしれません。
なおメモリはないけどストレージはそこそこあるという前提で書いてます。

68user様
sort -m *.splitted-and-sorted | uniq -d についてです。
まだ試せていませんが、調べた所 sort -m はソートせずにマージのみ行うと認識しました。
マージというのはマージソートの事でしょうか。
そうでない場合、分割された各ファイルがソートされていたとしても、それぞれを連結しただけでは uniq -d では重複検出できないと思います。異なるファイル間で重複レコードが発生した場合など。
またマージソートの場合はやはりメモリに乗りきらないかと思います。
月曜日までにご返信いただければラッキー程度です。
月曜日には自分で検証できますので。
ちなみにストレージはそこそこあると思います。
マージというのは、あらかじめソートされた複数ファイルから、全体としてソートされた1つのファイルを作ると言うことなので、出力ファイルはソート済みで、uniq コマンドが使えます。
データ用のメモリーは、「最大行長 * ファイル数」だけです。
例で言い換えると、
学校の各クラスの生徒が、身長順にクラス毎に一列になっているとして(5クラスの場合は5列に並ぶ)、
「各列の先頭の人の中で一番身長の低い人を出力列に移動する」
という操作を誰もいなくなるまで繰り返せば、出力列には全生徒が身長順に並んでいます。
これがマージです。
比較するのは先頭の5人だけで、先頭の人が移動するまで、次の人のデータは読まないので、
データを読み込むメモリーは5人の分だけあれば良いです。

otn様
ありがとうございます。納得できました。
stackoverflow等確認した所、想定しない一時ファイルが作成される、一度に処理可能なファイル数に上限がある、などの情報があり、他オプションも適切に利用する必要があるものと思いました。

回答3件
あなたの回答
tips
プレビュー