2017-02-28 77 views
8

我使用Spotify's Luigi在Python 3.6中編寫我的第一個項目,以便在流水線中安排一些自然語言處理任務。在Luigi中的任務之間傳遞Python對象?

我注意到Task類的output()函數總是返回某種Target對象,它只是某處的某個文件,無論是本地的還是遠程的。因爲我的任務會生成更復雜的數據結構,比如解析樹,所以將它們作爲字符串寫入文件並在之後再次讀取它們是非常尷尬的。

因此,我想問一下在管道中的任務之間是否有可能傳遞Python對象?

回答

7

短的答案:號

路易參數被限制爲日期/ datetime對象,字符串,整數和浮點型。請參閱docs for reference

這意味着,你需要你的序列化複雜的數據結構爲一個字符串(使用JSON,msgpack,任何你喜歡的串行器,甚至壓縮它),並把它作爲一個字符串參數。

當然,你可以寫一個自定義參數的子類,但你需要實現serialize and parse methods基本。

但是請注意:如果您使用參數而不是將計算的數據保存到目標,那麼您將失去使用Luigi的一個關鍵優勢:如果樹中的父任務失敗的次數超過了您指定的重試次數,那麼你需要運行再次計算複雜數據結構的任務。如果您的任務計算複雜的數據或需要大量時間或消耗大量資源,那麼您應該將輸出保存爲目標,以便不必再次執行所有昂貴的計算。

而且超越:另一個任務可能也需要這些數據,那麼爲什麼不保存它呢?

而且,請注意,目標不僅是文件:您可以將數據保存到數據庫表,Redis的,Hadoop的,彈性搜索索引,以及更多:http://luigi.readthedocs.io/en/stable/api/luigi.contrib.html#submodules

+0

非常感謝! A +答案。 – Kaleidophon