我需要在Web服務中使用斯坦福分析器。由於SentenceParser加載一個大對象,我將確保它是一個單例,但在這種情況下,它是線程安全的(根據http://nlp.stanford.edu/software/parser-faq.shtml,否)。如何有效地完成它呢?一種選擇是在使用時鎖定對象。在Web服務中使用斯坦福分析器
任何想法斯坦福大學的人如何做到這一點http://nlp.stanford.edu:8080/parser/?
我需要在Web服務中使用斯坦福分析器。由於SentenceParser加載一個大對象,我將確保它是一個單例,但在這種情況下,它是線程安全的(根據http://nlp.stanford.edu/software/parser-faq.shtml,否)。如何有效地完成它呢?一種選擇是在使用時鎖定對象。在Web服務中使用斯坦福分析器
任何想法斯坦福大學的人如何做到這一點http://nlp.stanford.edu:8080/parser/?
我不知道斯坦福大學的人們如何實施他們的服務,但我會根據消息框架(如http://www.rabbitmq.com/)構建這樣的服務。因此,您的前端服務將接收文檔並使用消息隊列與幾個執行NLP解析的工作人員進行通信(存儲文檔和檢索結果)。工作人員 - 在完成處理後 - 將結果存儲到由前端服務使用的隊列中。這種架構將允許您在高負載情況下動態添加新工作人員。特別是NLP標籤需要一些時間 - 每個文檔需要幾秒鐘的時間。
如果爭用不是一個因素,鎖定(同步)將是您提到的一個選項,它可能已經足夠好了。
但是,如果存在爭用,我會看到三個一般選項。
(1)每次
實例它每次執行分析時就實例作爲一個局部變量。局部變量是平凡的安全。實例化當然不是當然的,但根據具體情況它可能是可以接受的。使用threadlocals
如果實例證明是代價高昂的
(2),可以考慮使用threadlocals。每個線程都會保留自己的解析器副本,並且解析器實例將在給定線程上重用。但是,關卡鎖並非沒有問題。線程封鎖可能不會被垃圾收集,而不會被設置爲null或直到線程消失。所以如果有太多這樣的話會有記憶問題。其次,小心重複使用。如果這些解析器是有狀態的,則需要確保清理並恢復初始狀態,以便後續使用threadlocal實例時不會受到之前使用的副作用的影響。
(3)池
池是一般不再推薦,但如果對象大小是真正的大,因此,你需要對你能允許實例的數量的硬性限制,然後使用對象游泳池可能是最好的選擇。
「大」他的意思是300MB到600MB大。 – 2010-12-03 20:00:54