別の質問をしました: https://stackoverflow.com/questions/1180240/best-way-to-sort-1m-records-in-python ここで、100万件のレコードをソートするための最良のアプローチを決定しようとしていました。私の場合、コレクションに追加のアイテムを追加して、再ソートできるようにする必要があります。このタスクには Zope の BTree を使用するように勧められました。いくつかの読書をした後、どのデータをセットに入れるかについて少し困惑しています。
基本的に、各レコードには 2 つのデータがあります。1. ユーザーにマップされる一意の ID と 2. 並べ替え対象の値。
アイテムをタプルとして OOSet に追加できることがわかりました。ここで、並べ替えの値はインデックス 0 です。したがって、(200, 'id1'),(120, 'id2'),(400, 'id3')
結果のセットはid2, id1 and id3
順番に並べ替えられます。
ただし、この要件の一部は、各 ID がセット内で 1 回だけ出現することです。このセットには定期的にデータを追加しますが、新しいデータには重複した「ID」が含まれる場合と含まれない場合があります。それらが重複している場合は、値を更新し、追加のエントリを追加したくありません。したがって、上記のタプルに基づいて、セットに追加し、出力を順番に並べ(405, 'id1'),(10, 'id4')
たいと思います。id4, id2, id3, id1
これを達成する方法に関する提案。この件に関して私の初心者で申し訳ありません。
* 編集 - 追加情報 *
プロジェクトの実際のコードを次に示します。
for field in lb_fields:
t = time.time()
self.data[field] = [ (v[field], k) for k, v in self.foreign_keys.iteritems() ]
self.data[field].sort(reverse=True)
print "Added %s: %03.5f seconds" %(field, (time.time() - t))
foreign_keys は、各 id をキーとし、追加データのディクショナリを値とするディクショナリ内の元のデータです。data は、ソートされたデータのリストを含む辞書です。
補足として、lb_fields の for フィールドの反復が実行されるたびに、ソートにかかる時間が増加します。16 のフィールドごとに 100 万件のレコードがソートされた後、約 4 ギガまたは RAM を使用しています。最終的に、これは 48 ギグのマシンで実行されます。