Проверка, были ли сброшены буферы в R - PullRequest
6 голосов
/ 09 августа 2011

У меня есть большие, большие файлы, с которыми я работаю, и я использую несколько различных функций ввода / вывода для доступа к ним.Наиболее распространенным является пакет bigmemory.

При записи в файлы я научился трудному способу очистки выходных буферов, в противном случае все ставки на сохранение данных сохранены.Однако это может привести к очень долгому времени ожидания, пока bigmemory делает свое дело (много минут).Я не знаю, почему это происходит - это не всегда происходит и не так легко воспроизводится.

Есть ли способ определить, были ли очищены буферы ввода-вывода в R, особенно для bigmemory?Если операционная система имеет значение, тогда не стесняйтесь ограничивать ответ таким образом.

Если ответ может быть обобщен за пределы bigmemory, это было бы здорово, поскольку я иногда полагаюсь на другие функции отображения памяти или/ O потоки.

Если нет хороших решений для проверки, были ли очищены буферы, есть ли случаи, в которых можно предположить, что буферы были очищены?Т.е. кроме использования flush().

Обновление : я должен уточнить, что это все двоичные соединения.@RichieCotton отметил, что isIncomplete(), хотя в справочной документации упоминаются только текстовые соединения.Не ясно, пригодно ли это для бинарных соединений.

Ответы [ 2 ]

0 голосов
/ 22 августа 2011

Я предложу свой собственный ответ, но я приветствую все, что яснее.

Из того, что я видел до сих пор, различные функции подключения, например, file, open, close, flush, isOpen и isIncomplete (среди прочих) основаны на определенных типах соединений, например, файлах, каналах, URL-адресах и некоторых других вещах.

В отличие от bigmemory имеет свой собственный тип соединения, а объект bigmemory - это объект S4 со слотом для адреса памяти для буферов операционной системы.После размещения ОС отвечает за очистку этих буферов.Поскольку это ответственность ОС, то получение информации о «грязных» буферах требует взаимодействия с ОС, а не с R.

Таким образом, ответ для bigmemory - «нет», поскольку данные хранятся в ядре.буфер, хотя это может быть «да» для других соединений, которые обрабатываются через STDIO (то есть хранятся в «пространстве пользователя»).

Для получения дополнительной информации о стороне ОС / ядра см. thisвопрос по SO ;Я исследую пару программ (не только R + bigmemory), которые производят курьезную очистку буфера, и этот поток помог мне понять, что такое ядро.

0 голосов
/ 09 августа 2011

Является ли это более убедительным, что isIncomplete () работает с двоичными файлами?

# R process 1
zz <- file("~/test", "wb")
writeBin(c(1:100000),con=zz)
close(zz)

# R process 2
zz2 <- file("~/test", "rb")
inpp <- readBin(con=zz2, integer(), 10000)
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)}
close(zz2)

(изменено из файла справки (соединений).)

...