文字列と数値の確率で構成されるデータベースがあります (他の列はありますが、質問には関係ありません)。簡略化されたスキーマは
+-----------------------+----------------------+
| gopair | P_high |
+-----------------------+----------------------+
| GO:0000398_GO:0030540 | 0.275997567007171 |
| GO:0015198_GO:0016846 | 5.24489289777325e-06 |
| GO:0034649_GO:0072141 | 0.00338367340340417 |
| GO:0004303_GO:0031053 | 0.110417921058026 |
+-----------------------+----------------------+
私の仕事では、特定の GO ペアに関連付けられた値をデータベースに照会するスクリプトを実行します。私の結果が無作為に得られた結果と異なることを証明する必要があります。したがって、実行したいテストの 1 つは、P_high
列をシャッフルしてからスクリプトを実行し、結果を分析することです。
入力ファイルをシャッフルしてデータベースをリロードしようとしましたが、問題の入力ファイルが 7GB のテキスト ファイルであり、3GB の RAM しか搭載されていないマシンでは扱いにくいため、これは複雑です。
では、残りを静的に保ちながら、データベース内の特定の列をランダム化する方法はありますか?
警告:
- 問題のテーブルは LARGE (60,164,966 行) です。
- 厳密な数学的ランダム性は必要ありません
- 同じ周波数を維持する必要があります。N 個のペアが実際のデータベースでPの確率を持つ場合、ランダムなデータベースでPの確率を持つにはN 個のペアが必要です。
- 永続的なソリューションが必要です。私のスクリプトでは、データベースに対して同じペアを複数回クエリする可能性があるため、単純にランダムなペアを選択するだけでは十分ではありません。
- これらすべてを繰り返し実行する必要があるため、スクリプト可能な (できれば Perl) ソリューションが優先されます。
- Ubuntu サーバーで、readline 6.1 を使用して debian-linux-gnu (x86_64) 用の mysql Ver 14.14 Distrib 5.1.41 を実行しています。