Как открыть файл, а затем записать в него строки в цикле - PullRequest
1 голос
/ 09 июля 2019

Есть довольно много сообщений R с похожей темой, но они не предоставляют то, что я ищу.

Код Psuedo (это НЕ означает R) для того, что я хочу, это какследующим образом:

fileConn <- file("foo.txt")
for (i in 1:hiLimit) {
  # extract elements from each nested and variable json element in an R list.
  # paste elements into a comma separated list
  write(pastedStuff,fileConn)
}
close(fileConn)

Теперь, если я пропущу 'file' и 'close' и просто использую 'cat' с именем файла и 'append = TRUE' следующим образом:

cat(paste(cve,vndr,pnm,vnmbr,vaffct,sep=","),file="outfile.txt",append=TRUE,sep="\n")

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

Я не смог понять, как добиться результата с помощью метода в коде psuedo, который открывает и закрывает файл только один раз.Использование 'cat' или 'writeLines' просто дает мне последнюю строку в файле.

В порядке пояснения проблема, над которой я работаю, заключается в построении кадра данных с нуля строка за строкой.Мои временные параметры (см. Ниже) указывают, что, безусловно, самый быстрый способ, которым я могу это сделать, - это записать csv на диск и затем прочитать его обратно для создания кадра данных.Это безумие, но так оно и происходит.

## Just the loop without any attempt to collect parsed data into a dataframe
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
   0.30    0.00    0.29 

## Using rbind as in rslt<- rbind (rslt,c(stuff)) to build dataframe in the loop.
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
 990.46    2.94  994.01 

# Preallocate and insert list as per 
# /3054937/sozdanie-r-kadra-dannyh-postrochno
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
1451.42    0.04 1452.37 

# Write to a file with cat and read back the csv.
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
  10.70   29.00   45.42

Любые предложения приветствуются!

1 Ответ

0 голосов
/ 09 июля 2019

Не уверен, как я могу вам помочь.Но вы можете открыть соединение и держать его открытым до завершения записи.

testcon <- file(description = "C:/test.txt", open = "a")

isOpen(testcon)
[1] TRUE

start <- Sys.time()
for (i in 1:10000) {

 cat(paste0("hallo", i), file= testcon, append=TRUE,sep="\n")

}
end <- Sys.time()

end-start
Time difference of 0.2017999 secs

close(testcon)

Что, по-видимому, значительно быстрее, чем:

start <- Sys.time()
for (i in 1:10000) {

  cat(paste0("hallo", i), file= "C:/test.txt", append=TRUE,sep="\n")

}
end <- Sys.time()

end-start
Time difference of 3.382569 secs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...