2009-11-08 22 views
2

我用Python/Twisted編寫了一個音頻廣播服務器。它工作正常,但內存的使用增長太快!我認爲這是因爲某些用戶的網絡可能不足以及時下載音頻。如何減少Twisted服務器的內存使用量?

我的音頻服務器廣播音頻數據到不同的監聽器的客戶,如果他們中的一些不能下載的時間音頻,這意味着,我的服務器保持的音頻數據,直到收到聽衆。而且,我的音頻服務器是一臺廣播服務器,它接收音頻數據並將它們發送到不同的客戶端,我通過Twisted將這些數據複製到不同的緩衝區中,即使它們是相同的音頻片段。

我想減少內存使用的使用,所以我需要知道的是由客戶端接收的音頻時,這樣我可以決定什麼時候丟棄一些緩慢的客戶。但我不知道如何用Twisted實現這一點。有沒有人有想法?

而且還有什麼我可以做,以減少內存使用量的使用情況如何?

謝謝。 Victor Lin。

+0

這是我做的另一篇文章,最後我找到原因http://stackoverflow.com/questions/2100192/how-to-find-the-source-of-increasing-memory-usage-of-a-雙絞線服務器/ 2229010#2229010 – 2010-02-09 12:46:04

回答

2

你沒有說,但我會假設你使用TCP。由於客戶無法像接收數據那樣快速地發送數據,因此很難編寫一個基於UDP的系統來增加內存。

TCP有內置的流量控制功能。如果接收方無法按照您希望發送的數據那樣快速讀取數據,則會向您提供此信息,並且發送速度可能會更慢。與BSD套接字API一起工作的方式是send(2)調用將阻塞或將返回0,表示它不能將任何字節添加到發送緩衝區。它在Twisted中的工作方式是通過一個稱爲「生產者和消費者」的系統。這個系統的要點是你向消費者註冊一個生產者。生產者反覆向消費者呼叫寫入。當消費者無法跟上時,它會在製造商處調用pauseProducing。當消費者再次準備好更多數據時,它會在生產者上調用resumeProducing

您可以在Twisted文檔的一部分producer/consumer howto中詳細瞭解該系統。

-5

確保您使用Python的garbage collector,然後再通過並刪除不使用的變量。