2011-07-01 77 views
2

我有一個表格,其中包含我想查找僞隨機間隔的行的postgres數據庫。有些我想每小時查一次,一天一次,一週一次。我希望查找在他們的時間窗口內處於僞隨機間隔。所以,我每天想要做的查找應該在每次運行的不同時間進行。隨機查找方法

我懷疑有一個更簡單的方法來做到這一點,但這是我的粗略計劃: 有一個設置列爲每個查找項目。當腳本啓動時,它將每次查找的歷元時間隨機化並將其設置到設置列中,以確定下一次查找的時間。然後我運行一個等待1的連續循環來查看曆元時間是否與任何請求的查找匹配。在運行查找時,它會重新計算下一次查找的時間。

我的問題: 即使在設計階段,這看起來像是一個膠帶和麻線例程。什麼是正確的方法來做到這一點?

如果偶然,我的想法是做到這一點的正確方法,我的想法是重複循環,等待1正確的路?如果我有兩次查找,我可能會錯過一次,但我可以忍受。

感謝您的幫助!

+0

你說:「所以,我每天想要做的一次查詢應該在每次運行的不同時間發生。」 「每次不同的時間」不是僞隨機的。時間的僞隨機選擇可能會連續幾天返回同一時間。你確定這很重要嗎? –

+0

你說得對。我試圖描述我不希望它在第1天計算僞隨機時間,然後每天在同一時間運行,除非這是僞隨機發生器確定的結果。 – McLuvin

回答

5

在NextCheckTime表中添加一列。您可以使用時間戳或只是一個具有原始紀元時間的整數。在NextCheckTime上添加(非唯一)索引。

當您向數據庫添加一行時,通過獲取當前時間,添加基本間隔以及添加/減去隨機因子(可能是基本間隔的25%或任何適合您情況的內容)來填充NextCheckTime, 。例如:

my $interval = 3600; # 1 hour in seconds 
my $next_check = time + int($interval * (0.75 + rand 0.5)); 

然後在您的循環中,只需SELECT * FROM table ORDER BY NextCheckTime LIMIT 1。然後休眠直到由此返回的NextCheckTime(假設它還沒有在過去),執行查找並按上述方式更新NextCheckTime。

如果您需要處理某些其他進程新添加的行,則可能會對睡眠設置一個限制。如果NextCheckTime將來超過10分鐘,然後休眠10分鐘並重復SELECT以查看是否添加了新行。 (同樣,確切的限制取決於你的情況。)

+0

這看起來很完美。謝謝! – McLuvin

0

你的數據集有多大?如果它是幾千行而不是隨機化整個列表並抓取第一行x行就可以了。隨着您設置的規模不斷擴大,這種可擴展性會越來越差。性能以非線性速率下降。但是如果你只需要最多一小時運行一次,那麼只要不殺死同一個盒子上的其他進程,只需要一兩分鐘就沒有什麼大不了的。

如果你有一個無縫的序列,是否從一開始就或附加,那麼你可以使用索引的東西,如:

$i=random(0,sizeofset-1); 
select * From table where seqid=$i; 

,並獲得良好的可擴展性,行數以百萬計。

+0

謝謝Scott。可伸縮性對我來說是一個問題。我欣賞你的想法。 – McLuvin