#r #stream #stdout #stdin #read.table
#r #поток #стандартный вывод #stdin #read.table
Вопрос:
После нескольких дней поиска в Google и не найдя ответа, я решил опубликовать его здесь:
У меня сложная проблема с R, которую я, похоже, не могу решить при чтении из stdin с помощью read.table. К сожалению, из-за модели / процесса, которые я использую, строки чтения и strsplit слишком неэффективны, поэтому я бы хотел придерживаться read.table, если это возможно, поскольку это дает мне ускорение примерно в 100 раз.
В любом случае, вот как выглядит моя ситуация:
inStream = file("stdin","r")
while(TRUE){
data_chunk = tryCatch(read.table(file=inStream,header=FALSE,sep="t"), error=function(e) NULL)
if(is.null(data_chunk)) break
<Do some R modeling with the chunk of data...>
}
Я использую tryCatch для проверки ошибки, когда она попадает в конец потока, и останавливаю цикл.
Согласно документации read.table, если вы добавляете новую строку или EOF в поток stdin, это должно сигнализировать read.table об остановке и продолжении — однако, если я попробую непрерывный поток (даже с новыми строками или EOF в потоке), он просто зависает в ожиданиибуфер стандартного вывода для закрытия.
Есть ли способ сделать это с помощью read.table — или даже более эффективный способ использовать строки чтения или что-то в этом роде? Мне нужно иметь возможность обрабатывать поток stdin большими порциями без значительного снижения производительности. Любая помощь будет с благодарностью!