2

従業員名と年齢列を含むcsvファイル(> 5GB)があるとします。ファイルは年齢でソートされています。ここで、ユーザーにAgeを使用してこのファイルを検索してもらいます。誰かがこの要件に最も適したデータ構造を教えてもらえますか?

myfile.csv

25 ABC    
25 MNP
14 XYZ
14 PQR

入力

14

出力

XYZ
PQR
4

2 に答える 2

4

ファイルが大きすぎてRAMに収まらない場合は、インデックスを作成できます。これにより、ディスク読み取りの数を最小限に抑えることができます(RAM読み取りよりもはるかに低速です)。

ディスクによく使用されるインデックスには、B +ツリー(トップレベルがRAMに格納されている)とハッシュテーブルがあります。

または、 SQLテーブルとして保存し、ライブラリに自動的に処理させることもできます。

別の方法として、範囲がかなり小さいため(年齢が200を超えるとは想像できません)、200(またはおそらくそれ以下)の異なるファイルを使用できます。names_1,names_2,...,names_200ここでnames_i、年齢がであるすべての名前のリストを保持しますi
(また、この方法では多くのエントリで年齢が省略されているため、実際にRAMに収まる可能性がありますdictionary:age->list<names>

データがRAMに収まる場合は、並べ替えられた配列を使用して(データの変更が頻繁に行われない/予期されない場合)、バイナリ検索を使用できます。
データに変更を加える必要がある場合は、RAM上のハッシュテーブルや自己平衡BSTなどの他の構造を使用できます。

于 2012-10-13T17:43:56.437 に答える
1

インフラストラクチャでメモリ内ソリューションが可能かどうかは示されていません。もしそうなら、あなたがあなたの質問にpythonのタグを付けているのを見て、私はファイルの内容をdefaultdictに読み込むことを検討します。パフォーマンスが許容範囲内であれば、標準ライブラリベースの迅速なソリューションがあります。

>>> from collections import defaultdict
>>> z = defaultdict(list)
>>> z[25].append("ABC")
>>> z[25].append("MNP")
>>> print z[25]
['ABC', 'MNP']
于 2012-10-13T18:07:30.890 に答える