2016-09-27 63 views
-1

我有以下Python代碼,我從標準輸入收集數據到列表中並在其上運行syntaxnet。數據是json對象的形式,我將從中提取文本字段並將其提供給syntaxnet。從stdin收集數據塊:Python

data = [] 
for line in sys.stdin: 
    data.append(line) 
run_syntaxnet(data) ##This is a function## 

我這樣做,因爲我不想Syntaxnet爲每單鳴叫運行,因爲它需要很長的時間,從而降低性能。

此外,當我在非常大的數據上運行此代碼時,我不想永遠收集它並耗盡內存。因此,我希望以塊的形式收集數據 - 可能每次都有10000條推文,並在其上運行Syntaxnet。有人可以幫助我如何做到這一點?

此外,我想了解什麼可以是最大長度的清單data,以便我沒有用完內存。

編輯:

我使用的代碼:

data = [] 
for line in sys.stdin: 
    data.append(line) 
    if len(data) == 10000: 
     run_syntaxnet(data) ##This is a function## 
     data = [] 

它運行如果輸入的數據行數是10000多,我不知道該怎麼做完全正常與其餘的行。

例如,如果總行數爲12000,則會根據需要處理前10000行,但由於未滿足條件len(data) > 10000,所以會停止接下來的2000行。

我想要做的事,如:

if len(data) > 10000 or 'EOF of input file is reached': 
    run_syntaxnet(data) 

有人能告訴我如何檢查輸入文件的EOF?提前致謝!

PS:Python文件中的所有數據都來自Pig Streaming。另外,我不能真正計算輸入數據的行數,並將其作爲參數進行發送,因爲我擁有數百萬行,並且自行計數將永遠佔用。

+0

看一看發電機 – iScrE4m

回答

0

我想這是所有你需要:

data = [] 
for line in sys.stdin: 
    data.append(line) 
    if len(data) == 10000: 
     run_syntaxnet(data) ##This is a function## 
     data = [] 

一旦列表到10000,然後運行該功能,重置您的數據列表。此外,列表的最大尺寸因機器的不同而不同,具體取決於您擁有多少內存,所以最好嘗試一下不同的長度,找出最佳狀態。

+0

很好,謝謝!我嘗試了10000,它的工作,會嘗試一個更大的數字。 – kskp

0

我將收集到的數據塊,處理這些數據塊時,他們得到「大」:

LARGE_DATA = 10 

data = [] 
for line in sys.stdin: 
    data.append(line) 
    if len(data) > LARGE_DATA: 
     run_syntaxnet(data) 
     data = [] 
run_syntaxnet(data) 
+0

我明白你在說什麼。具有可配置的參數總是很好的是,脂肪肝總是告訴我。謝謝! – kskp