2012-03-10 51 views
3

我正在Python中創建一個應用程序(應用程序A),它監聽端口,接收NetFlow記錄,封裝它們並將它們安全地發送到另一個應用程序(應用程序B)。應用程序A還會檢查記錄是否已成功發送。如果不是,則必須保存。應用程序A等待幾秒鐘,然後嘗試再次發送等。這是重要的部分。如果發送失敗,則必須存儲記錄,但同時還有更多記錄可以到達並且它們也需要存儲。理想的做法是排隊。不過,我需要這個隊列在文件中(在磁盤上)。例如,我發現這個代碼爲http://code.activestate.com/recipes/576642/,但它「在打開時將完整的文件加載到內存中」,這正是我想要避免的。我必須假設這個帶有記錄的文件將具有多個GB。Python:基於文件的線程安全隊列

所以我的問題是,你會推薦什麼來存儲這些記錄?它需要處理大量數據,另一方面,如果速度不是太慢,它會很好,因爲在正常活動期間,一次只保存一條記錄,並且立即讀取並刪除。所以基本狀態是一個空隊列。它應該是線程安全的。

我應該使用數據庫(dbm,sqlite3 ..)或類似pickle,shelve或其他東西嗎?

我有點在這方面的消費......謝謝。

回答

1

您可以使用Redis作爲其數據庫。它速度非常快,排隊非常好,並且可以通過幾種方式將其狀態保存到磁盤,具體取決於所需的容錯級別。作爲一個外部過程,您可能不需要使用非常嚴格的保存策略,因爲如果程序崩潰,所有內容都將保存在外部。

看到這裏http://redis.io/documentation,如果你想要更詳細的信息如何在redis中做到這一點,我很樂意詳細說明。

+1

謝謝您的意見,並對已故的答案感到抱歉。我在看你提出的解決方案,但我終於意識到我想要更標準的東西。我的意思是最好使用Python標準模塊,因爲應用程序的可移植性。我結束了使用sqlite,我對此非常滿意。我只需設置一些PRAGMA設置(例如同步到OFF或journal_mode爲OFF)來提高數據庫性能。 – samuelg0rd0n 2012-04-10 09:23:08