2016-09-27 6 views
-1

У меня есть следующий код Python, где я собираю данные из стандартного ввода в список и запускаю на нем синтаксическую сеть. Данные находятся в форме объектов json, из которых я извлечу текстовое поле и передам его в синтаксическую сеть.Соберите данные в кусках из stdin: Python

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

Я делаю это, потому что я не хочу Syntaxnet запускать для каждого твита, так как это займет очень много времени, и, следовательно, к снижению производительности.

Кроме того, когда я запускаю этот код на очень больших данных, я не хочу постоянно собирать его и заканчивать память. Поэтому я хочу собирать данные в кусках - может быть как 10000 твитов за раз и запускать на них Syntaxnet. Может ли кто-нибудь помочь мне, как это сделать?

Кроме того, я хочу понять, что может быть максимальной длиной списка data, так что у меня не хватает памяти.

EDIT:

Я использовал код:

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

, который работает прекрасно, если число строк в исходных данных кратна 10000. Я не уверен, что делать с остальными рядами.

Например, если общее число строк равно 12000, первые 10000 строк обрабатываются так, как я хочу, но следующий 2000 остановлен, так как условие len(data) > 10000 не выполняется.

Я хочу сделать что-то вроде:

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

Может кто-нибудь сказать мне, как проверить на EOF входного файла? Заранее спасибо!

PS: Все данные в файл python взяты из Pig Streaming. Кроме того, я не могу позволить себе подсчитать количество строк sin входных данных и отправить в качестве параметра, так как у меня есть миллионы строк, и подсчет будет принимать навсегда.

+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

Я вижу, что вы говорите. Конфигурируемые параметры всегда хороши, о чем всегда говорил мне ppl. Благодаря! – kskp