【问题标题】:Collect data in chunks from stdin: Python从标准输入分块收集数据:Python
【发布时间】:2017-02-05 07:29:33
【问题描述】:

我有以下 Python 代码,我在其中将标准输入中的数据收集到一个列表中并在其上运行 syntaxnet。数据采用 json 对象的形式,我将从中提取文本字段并将其提供给 syntaxnet。

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。此外,我无法计算输入数据中的行数并将其作为参数发送,因为我有数百万行并且计数本身将花费很长时间。

【问题讨论】:

  • 看看生成器

标签: python python-2.7 stream stdin eof


【解决方案1】:

我会将数据收集成块并在它们变得“大”时处理这些块:

LARGE_DATA = 10

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

【讨论】:

  • 我明白你在说什么。拥有可配置的参数总是好的,这是 ppl 一直告诉我的。谢谢!
【解决方案2】:

我想这就是你所需要的:

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

一旦列表达到 10000,然后运行该函数并重置您的数据列表。此外,列表的最大大小会因机器而异,具体取决于您拥有多少内存,因此最好尝试不同的长度并找出最佳长度。

【讨论】:

  • 太好了,谢谢!我尝试了 10000 并且它有效,将尝试更大的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2012-01-25
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多