Слишком много открытых файлов: '/home/USER/PATH/SERVICE_ACCOUNT.json' при вызове Google Natural Language API

Я работаю над проектом анализа настроений с использованием Google Cloud Natural Language API и Python, этот вопрос может быть похож на этот другой вопрос, я делаю следующее:

  1. Читает CSV-файл из Google Cloud Storage, файл содержит около 7000 записей.
  2. Преобразует CSV в Pandas DataFrame.
  3. Обходит фрейм данных и вызывает API естественного языка для выполнения анализа тональности одного из столбцов фрейма данных, в том же цикле for я извлекаю оценку и величину < / strong> из результата и добавьте эти значения в новый столбец фрейма данных.
  4. Сохраните фрейм данных результата обратно в GCS.

Я помещу свой код ниже, но до этого я просто хочу упомянуть, что я тестировал его с образцом CSV с менее чем 100 записями, и он работает хорошо, я также знаю о лимите квоты в 600 запросов в минуту. , причина, по которой я откладываю каждую итерацию, тем не менее, я получаю ошибку, указанную в заголовке. Мне также известно о предложении об увеличении ulimit, но Не думаю, что это хорошее решение.

Вот мой код:

from google.cloud import language_v1
from google.cloud.language_v1 import enums
from google.cloud import storage
from time import sleep
import pandas
import sys

pandas.options.mode.chained_assignment = None

def parse_csv_from_gcs(csv_file):
    df = pandas.read_csv(f, encoding = "ISO-8859-1")

    return df

def analyze_sentiment(text_content):
    client = language_v1.LanguageServiceClient()
    type_ = enums.Document.Type.PLAIN_TEXT
    language = 'es'
    document = {"content": text_content, "type": type_, "language": language}
    encoding_type = enums.EncodingType.UTF8
    response = client.analyze_sentiment(document, encoding_type=encoding_type)

    return response

gcs_path = sys.argv[1]
output_bucket = sys.argv[2]
output_csv_file = sys.argv[3]

dataframe = parse_csv_from_gcs(gcs_path)

for i in dataframe.index:
    print(i)
    response = analyze_sentiment(dataframe.at[i, 'FieldOfInterest'])
    dataframe.at[i, 'Score'] = response.document_sentiment.score
    dataframe.at[i, 'Magnitude'] = response.document_sentiment.magnitude
    sleep(0.5)

print(dataframe)
dataframe.to_csv("results.csv", encoding = 'ISO-8859-1')

gcs = storage.Client()
gcs.get_bucket(output_bucket).blob(output_csv_file).upload_from_filename('results.csv', content_type='text/csv')

Функция «analysis_sentiment» очень похожа на то, что есть в документации Google, Я немного изменил его, но он делает почти то же самое.

Теперь программа вызывает эту ошибку и вылетает, когда достигает записи между 550 и 700, но я не вижу корреляции между JSON учетной записи службы и вызовом API естественного языка, поэтому я также думаю, что когда я вызываю API, он открывает файл JSON с учетными данными, но после этого не закрывает его.

В настоящее время я застрял в этой проблеме, и у меня закончились идеи, поэтому любая помощь будет очень благодарна, заранее спасибо =)!

[ОБНОВЛЕНИЕ]

Я решил эту проблему, извлекая «client» из метода «analysis_sentiment» и передав его в качестве параметра следующим образом:

def analyze_sentiment(ext_content, client):
    <Code>    

Похоже, каждый раз, когда он достигает этой строки:

client = language_v1.languageServiceClient()

Он открывает файл JSON с учетными данными и не закрывается, поэтому извлечение его в глобальную переменную сделало эту работу =).


person Daniel E. Vazquez    schedule 10.04.2020    source источник


Ответы (1)


Я обновил исходный пост с решением для этого, но в любом случае спасибо всем, кто это видел и пытался ответить =)!

person Daniel E. Vazquez    schedule 11.04.2020