Что такое ленивое чтение, и зачем оно надо
Недавно я рассказывал про эксперименты, которые проводились над пакетом readr. В их основе лежало ленивое чтение данных.
Что такое ленивое чтение
Ленивое чтение - позволяет не считывать весь файл командой чтения, вместо этого файл индексируется, и R запоминает расположение каждой строки данных. Процесс чтения инициализируется только в момент обращения к данным, и считывает только необходимый для выполняемой операции фрагмент данных.
Пример
Давайте рассмотрим небольшой пример кода:
library(tidyverse)
df <- read_csv(readr_example("mtcars.csv"), lazy = TRUE)
df |>
filter(hp > 200) |>
summarise(mean(mpg))
Изображение к этому посту показывает какие данные readr в этом случае будет считывать, на схеме эти данные изображены оранжевым цветом.
Горизонтальная полоса вверху - это заголовки таблицы.
Вертикальная полоса - это столбец hp, который загружается целиком в связи с тем, что используется в функции filter().
А отдельные оранжевые ячейки это данные столбца mpg, только по тем строкам, которые остались после фильтрации по условию hp > 200.
Как видите, в зависимости от того, что вы делаете с файлом, ленивое чтение может значительно уменьшить потребляемый объём памяти файлом, к которому вам в конечном итоге потребуется доступ.
Активация ленивого чтения в vroom и readr
В пакете vroom ленивое чтение применяется по умолчанию. В readr активируется опцией options(readr.read_lazy = TRUE) или аргументом lazy, как в приведённом выше примере кода.
Проблема ленивого чтения на Windows
В одном из предыдущих постов я более подробно писал о проблеме ленивого чтения на Windows. Заключается она в том, что при ленивом чтении блокируется файловый дескриптор, и другие процессы и программы в этот момент не могут получить доступ к файлу, что может вызвать ошибки.
Ссылки:
- пример кода и изображение заимствованы из статьи "Eager vs lazy reading in readr 2.1.0"
#заметки_по_R