1. StringIO и BytesIO - это методы, которые управляют строковыми и байтовыми данными в памяти.
  2. StringIO используется для строковых данных, а BytesIO - для двоичных данных.
  3. Эти классы создают объект, подобный файлу, который оперирует строковыми данными.
  4. Классы StringIO и BytesIO наиболее полезны в сценариях, когда вам нужно имитировать обычный файл.

В этом случае данные не будут храниться в памяти (ОЗУ) после записи в файл.

with open("test.bin","wb") as f:
    f.write(b"Hello world")
    f.write(b"Hello world")
    f.write(b"Hello world")
    f.write(b"Hello world")
    f.write(b"Hello world")

В этом случае вместо записи содержимого в файл оно записывается в буфер памяти. (Кусок оперативной памяти)

with io.BytesIO() as f:
    f.write(b"Hello world")
    f.write(b"Hello world")
    f.write(b"Hello world")
    f.write(b"Hello world")
    f.write(b"Hello world")

по сути, написание с использованием класса BytesIO эквивалентно

space = b""
space += b"Hello world"
space += b"Hello world"
space += b"Hello world"
space += b"Hello world"
space += b"Hello world"

Тогда почему мы определяем io.BytesIO () и почему бы не использовать конкатенацию байтов?

Ответ: Оптимизация и производительность

Есть ли другой способ чтения данных в изменяемый буфер памяти?

Да, мы можем использовать readinto() method of файл объекта.

  1. Метод файлов readinto() может использоваться для заполнения данными любого предварительно выделенного массива. Включая массивы, созданные с помощью модуля numpy.
  2. В отличие от обычного метода read(), метод readinto() заполняет содержимое существующего буфера, а не выделяет новые объекты и возвращает их.
  3. Таким образом, мы можем использовать его, чтобы не выделять лишнюю память.

Примеры:

Вы хотите читать двоичные данные непосредственно в изменяемый буфер без какого-либо промежуточного копирования для управления двоичными данными.

Использованная литература: