2010-12-01 63 views
1

我需要在Web服務中使用斯坦福分析器。由於SentenceParser加載一個大對象,我將確保它是一個單例,但在這種情況下,它是線程安全的(根據http://nlp.stanford.edu/software/parser-faq.shtml,否)。如何有效地完成它呢?一種選擇是在使用時鎖定對象。在Web服務中使用斯坦福分析器

任何想法斯坦福大學的人如何做到這一點http://nlp.stanford.edu:8080/parser/

+0

「大」他的意思是300MB到600MB大。 – 2010-12-03 20:00:54

回答

0

我不知道斯坦福大學的人們如何實施他們的服務,但我會根據消息框架(如http://www.rabbitmq.com/)構建這樣的服務。因此,您的前端服務將接收文檔並使用消息隊列與幾個執行NLP解析的工作人員進行通信(存儲文檔和檢索結果)。工作人員 - 在完成處理後 - 將結果存儲到由前端服務使用的隊列中。這種架構將允許您在高負載情況下動態添加新工作人員。特別是NLP標籤需要一些時間 - 每個文檔需要幾秒鐘的時間。

2

如果爭用不是一個因素,鎖定(同步)將是您提到的一個選項,它可能已經足夠好了。

但是,如果存在爭用,我會看到三個一般選項。

(1)每次

實例它每次執行分析時就實例作爲一個局部變量。局部變量是平凡的安全。實例化當然不是當然的,但根據具體情況它可能是可以接受的。使用threadlocals

如果實例證明是代價高昂的

(2),可以考慮使用threadlocals。每個線程都會保留自己的解析器副本,並且解析器實例將在給定線程上重用。但是,關卡鎖並非沒有問題。線程封鎖可能不會被垃圾收集,而不會被設置爲null或直到線程消失。所以如果有太多這樣的話會有記憶問題。其次,小心重複使用。如果這些解析器是有狀態的,則需要確保清理並恢復初始狀態,以便後續使用threadlocal實例時不會受到之前使用的副作用的影響。

(3)池

池是一般不再推薦,但如果對象大小是真正的大,因此,你需要對你能允許實例的數量的硬性限制,然後使用對象游泳池可能是最好的選擇。