所以我终于成功了,并将其保留在这里供子孙后代使用。
从一个生成器开始,这里命名为iterator
因为我目前太害怕改变任何东西,因为担心它再次破裂:
def path_iterator(paths):
for p in paths:
print("yielding")
yield p.open("r").read(25)
获取迭代器、生成器或路径列表:
my_files = Path("/data/train").glob("*.txt")
这被包裹在我们的...function从上面,并传递到nlp.pipe
。输入发电机,输出发电机。这batch_size=5
这里是必需的,否则会陷入先读取所有文件的坏习惯:
doc = nlp.pipe(path_iterator(my_paths), batch_size=5)
重要的部分,也是我们做这一切的原因,是到现在为止什么也没发生。我们不会等待处理一千个文件或其他任何事情。这种情况只会发生一经请求,当你开始阅读时docs
:
for d in doc:
print("A document!")
您将看到交替的五个块(我们的batch_size,上面)“Yielding”和“A document”。现在它是一个实际的管道,启动后很快就会开始出现数据。
虽然我目前运行的版本稍旧,但致命一击是多处理:
# For those with these new AMD CPUs with hundreds of cores
doc = nlp.pipe(path_iterator(my_paths), batch_size=5, n_process=64)