Python'un stdout arabellek boyutunu artırın
Python'da stdoutarabellek boyutunu 8182'den artırmanın veya gerçekten ben çağırana kadar temizlemeyi geciktirmenin bir yolu var mı flush?
Çalışmayan denediğim şeyler:
- Bu sorunu Windows'ta çözebilirim çünkü arabelleğe doğrudan erişebilirim (örneğin , bu yazıya verdiğim yanıta bakın ). Ancak bu Unix için çalışmıyor.
- Yapıcıya geçerek bir dosyanın tampon boyutunu artırabilirim
buffer, ancakstdoutzaten oluşturulmuştur. - Arabelleğe almayı (
python -u) kapatmak , işleri daha da kötüleştirir! - Geçici bir arabellek kullanmak aynı sorunlarla karşılaşır -
stdouther 8192nci bayt geçici arabellekten kopyalandıktan sonra temizlenir.
Gerekçe: Buradaki amaç, konsol titremesini azaltmaktır. Bu soruya göre her şeyi arabelleğe almak gerçekten işe yarıyor, örneğin C'de veya Python'da Windows API kullanarak çalıştığımda işe yarıyor, ancak Python'daki 8182 sınırı Unix'te çözemediğim sorunlara neden oluyor gibi görünüyor.
Yanıtlar
Daha sys.stdout.bufferbüyük bir arabellek boyutuyla mevcut olan ham stdout akışını io.BufferedWritersarabilir ve ardından elde edilen arabelleğe alınmış ikili akışı aşağıdaki gibi arabelleğe alınmış bir metin akışı olarak sarabilirsiniz io.TextIOWrapper:
import io
import sys
sys.stdout = io.TextIOWrapper(io.BufferedWriter(sys.stdout.buffer, new_size))
Burada stdout'un arabellek boyutunu 100000'e yükseltmenin etkisinin bir gösterimi, böylece iki 10000 karakter uzunluğundaki yazdırma çıktısını manuel yıkama çağrılana kadar temizlemeyecek:
import io
import sys
import time
print('Original buffer size:', io.DEFAULT_BUFFER_SIZE)
for large_buffer in False, True:
if large_buffer:
print('Increasing buffer size...')
sys.stdout = io.TextIOWrapper(io.BufferedWriter(sys.stdout.buffer, 100000))
for i in range(2):
time.sleep(2)
print(str(i * 2) * 10000)
time.sleep(2)
print(str(i * 2 + 1) *10000)
print(f'Flush #{i + 1}')
sys.stdout.flush()
Demo: https://repl.it/@blhsing/UnkemptGullibleDecompiler
Cevabı buldum, aslında çok basit:
my_stdout = open( 1, "w", buffering = 100000 )
1olduğufilenoiçinstdout.sys.stdout = my_stdoutvarsayılanprinthedefte değişiklik yapmak için kullanılabilir .- Bunu yalnızca Unix'te test ettim.