gpt4 book ai didi

python - Unix 管道上的惰性 python

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:01 24 4
gpt4 key购买 nike

我有 4GB big_file.txt ,所以如果我尝试:

cat big_file.txt |
python3 -c "print( open('/dev/stdin').read() )" |
less

我的内存爆炸了,我死了。但如果我:

cat big_file.txt |
python3 -c "
for line in open('/dev/stdin'):
print(line)
" |
less

RAM 保持静止,我可以向下滚动,显然可以通过 less 按需读取文件。 ,甚至通过 python。我什至可以在打印之前处理该行,并且一切正常。

所以我想我可以:

seq 1 100 |
python3 -c "
fib = lambda n: n if n < 2 else fib(n - 1) + fib(n - 2)
for line in open('/dev/stdin'):
print( fib( int(line) ) )
" |
less

但是这会破坏CPU,我又死了。改变print对于 sys.stdout.writesys.stdout.flush至少可以在 less 中观看结果,但即使我不向下滚动,CPU 仍保持 100%,显然正在执行我不需要的行。

起初我认为这是一个“读取 block ”的事情,就好像有最小数量的数据需要通过管道传输,所以我尝试了:

seq -10000 100 |
python3 -c "
import sys
fib = lambda n: n if n < 2 else fib(n - 1) + fib(n - 2)
for line in open('/dev/stdin', 'r'):
sys.stdout.write( str( fib( int(line) ) ) + '\n' )
sys.stdout.flush()
" |
less

(请注意此 fib 只是回显任何 n < 2 )

但仍然没有运气。我也尝试过 seq -10000 100 > numbers.txt && cat numbers.txt | python3 -c blablabla

发生什么事了?为什么看起来像在 big_file.txt例如,我可以按需进行管道传输,并在 fib 中我不能吗?

最佳答案

less 执行的预读量远大于 CPU 密集型测试的优化目标。尝试:

seq 1000000 | tee test.out | less

并查看test.out的大小。在我的系统上,它是 80KB。

80KB 的 fib 结果预读确实会耗尽您的 CPU。

<小时/>

如果您想了解管道缓冲而不更少,您可以执行类似的操作:

seq 1000000 | tee test.out | { while read; do read </dev/tty; done; }

...它往往会更小(在我的系统上,72KB),但在大多数现代 unixlike 上仍然很重要。

关于python - Unix 管道上的惰性 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42492726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com