Слишком много открытых файлов: «/home/USER/PATH/SERVICE_ACCOUNT.json» при вызове Google Natural Language API - PullRequest
1 голос
/ 11 апреля 2020

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

  1. Считывает файл CSV из Google Cloud Storage, файл содержит приблизительно 7000 записей.
  2. Преобразует CSV в Pandas DataFrame.
  3. Выполняет итерации по фрейму данных и вызывает API естественного языка для выполнения анализа настроений в одном из столбцов фрейма данных, в том же для l oop Я извлекаю оценка и значение от результата и добавьте эти значения в новый столбец на фрейме данных.
  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')

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

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

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

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

Я решил эту проблему, извлекая client из метода analysis_sentiment . и передать его в качестве параметра, как следует s:

def analyze_sentiment(ext_content, client):
    <Code>    

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

client = language_v1.languageServiceClient()

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

1 Ответ

0 голосов
/ 11 апреля 2020

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

...