従業員名と年齢列を含むcsvファイル(> 5GB)があるとします。ファイルは年齢でソートされています。ここで、ユーザーにAgeを使用してこのファイルを検索してもらいます。誰かがこの要件に最も適したデータ構造を教えてもらえますか?
例:
myfile.csv
25 ABC
25 MNP
14 XYZ
14 PQR
入力:
14
出力:
XYZ
PQR
ファイルが大きすぎてRAMに収まらない場合は、インデックスを作成できます。これにより、ディスク読み取りの数を最小限に抑えることができます(RAM読み取りよりもはるかに低速です)。
ディスクによく使用されるインデックスには、B +ツリー(トップレベルがRAMに格納されている)とハッシュテーブルがあります。
または、 SQLテーブルとして保存し、ライブラリに自動的に処理させることもできます。
別の方法として、範囲がかなり小さいため(年齢が200を超えるとは想像できません)、200(またはおそらくそれ以下)の異なるファイルを使用できます。names_1,names_2,...,names_200
ここでnames_i
、年齢がであるすべての名前のリストを保持しますi
。
(また、この方法では多くのエントリで年齢が省略されているため、実際にRAMに収まる可能性がありますdictionary:age->list<names>
)
データがRAMに収まる場合は、並べ替えられた配列を使用して(データの変更が頻繁に行われない/予期されない場合)、バイナリ検索を使用できます。
データに変更を加える必要がある場合は、RAM上のハッシュテーブルや自己平衡BSTなどの他の構造を使用できます。
インフラストラクチャでメモリ内ソリューションが可能かどうかは示されていません。もしそうなら、あなたがあなたの質問にpythonのタグを付けているのを見て、私はファイルの内容をdefaultdictに読み込むことを検討します。パフォーマンスが許容範囲内であれば、標準ライブラリベースの迅速なソリューションがあります。
>>> from collections import defaultdict
>>> z = defaultdict(list)
>>> z[25].append("ABC")
>>> z[25].append("MNP")
>>> print z[25]
['ABC', 'MNP']