10000以上のレコードのテーブルに定義されたランダムな順序を割り当てようとしています。私は、開始日を利用し、ランダムに割り当てられた連続する各日付に1秒を追加する機能を持っています。それから私はランダムに割り当てられた日付でソートすることができました。私の機能は50レコードで正常に動作しましたが、10000レコードで失敗しました。10000+レコードにランダムな順序を割り当てます。
約9000レコードの正しい日付が設定されますが、1146レコードが割り当てられます0(1969-12-31 19:00:00)これは仕事に似たものを得る助けとなります。
function randomize(){
$count = $this->Application->find('count');
$order = range(0, $count-1); // Array of numbers 0 to count-1
$startDate = strtotime('December 13, 2011 0:00:00');
shuffle($order); // scramble array of numbers
$Applications = $this->Application->find('all');
set_time_limit(0);
foreach($Applications as $app){
$this->Application->id = $app['Application']['id'];
$this->Application->saveField('order', date('Y-m-d H:i:s', $startDate + $order[$this->Application->id]));
}
set_time_limit(30);
}
アップデート:私は、MySQLデータベースを使用してますが1つのランダム化のための永久的な状態を必要とし、RAND(BY ORDERごとにランダム化を繰り返しておりません)。オーバーヘッドを減らすためにコードを更新し(上記参照)、php.iniのメモリーを128Mから256Mに増やしました。コード変更では、悪い日付はもはや0ではなく、$ startDateと同じです。これは、$ order配列の配列に問題がある可能性があることを示しています。
レコードを注文するために日時フィールドを使用する理由がわからないのですが。なぜ整数を増やすだけではないのですか? – JJJ
これは、データ所有者が求めたものです。なぜ彼らが望むものなのかわからないが、彼らが望むものだ。 – Naidim
これをさらに最適化するには、 'find'メソッドで' id'を返すだけです。あなたは他のものを使用していないので、それを含むすべての点はありません。 – mrlee