Python'un stdout arabellek boyutunu artırın

Nov 26 2020

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, ancak stdoutzaten 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

1 blhsing Nov 27 2020 at 05:29

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

1 cz Nov 27 2020 at 16:39

Cevabı buldum, aslında çok basit:

my_stdout = open( 1, "w", buffering = 100000 )
  • 1olduğu filenoiçin stdout.
  • sys.stdout = my_stdoutvarsayılan printhedefte değişiklik yapmak için kullanılabilir .
  • Bunu yalnızca Unix'te test ettim.