打开的文件太多:调用 Google 的自然语言 API 时“/home/USER/PATH/SERVICE_ACCOUNT.json”

Too many open files: '/home/USER/PATH/SERVICE_ACCOUNT.json' when calling Google's Natural Language API

我正在使用 Google Cloud Natural Language API and Python, this question might be similar to this other question 进行情绪分析项目,我正在做的是:

  1. 从 Google 云存储中读取一个 CSV 文件,文件大约有 7000 条记录。
  2. 将 CSV 转换为 Pandas DataFrame。
  3. 遍历数据框并调用自然语言 API 对数据框的其中一个列执行情绪分析,在同一个 for 循环 我提取 scoremagnitude 并将这些值添加到数据框的新列中。
  4. 将结果数据帧存储回 GCS。

我会把我的代码放在下面,但在此之前,我只想提一下,我已经用少于 100 条记录的示例 CSV 对其进行了测试并且效果很好,我也知道配额限制每分钟 600 个请求,我延迟每次迭代的原因,仍然,我收到我在标题中指定的错误。 我也知道 suggestion 增加 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')

'analyze_sentiment'函数与Google's documentation中的非常相似,我只是稍微修改了一下,但它的作用几乎相同。

现在,程序在达到 550 到 700 之间的记录时引发该错误并崩溃,但我没有看到服务帐户 JSON 和调用自然语言 [=64] 之间的关联=],所以我还认为,当我调用 API 时,它会打开帐户凭据 JSON 文件,但之后不会关闭它。

我目前被这个问题困住了,运行 没有想法,所以任何帮助将不胜感激,提前致谢 =)!

[更新]

我通过从“analyze_sentiment”方法中提取“client”并传递它作为一个参数,如下:

def analyze_sentiment(ext_content, client):
    <Code>    

貌似每次都到这行:

client = language_v1.languageServiceClient()

它打开帐户凭据 JSON 文件但没有关闭, 所以将它提取到一个全局变量中使这项工作有效 =).

我已经用这个解决方案更新了原来的 post,但无论如何,感谢所有看到这个并尝试回复的人 =)!