몇 가지 개선 : 텍스트 파일로 결과를 저장, 두 번, 때마다 다섯 줄을 시연을 위해 나는 두 개의 열 및 10 행으로 데이터 프레임을 생성 루프 내에서 읽기 . for 루프 대신에 lapply()를 사용하고 read.table() 대신 data.table :: fread()를 사용하십시오.
루프 대 lapply 가능한 경우 for 루프 대신 lapply를 사용해야한다는 것이 잘 설명되어 있습니다. 빠른 Google 검색을 통해 많은 논점과 예가 나타납니다. lapply가 빠르면 목록 (또는 다른 저장 객체)을 정의하지 않고 목록을 반환하며 루프의 각 반복은 독립적 인 함수 호출이기 때문에 쉽게 병렬로 실행할 수 있습니다. 수평." 이 경우, lapply로 전환하면 7 초가 절약됩니다 (이는 사소한 것이지만 좋은 습관을 얻는 것이 낫습니다).
read.csv() 대 data.table :: FREAD() FREAD() read.csv를 통해 주요 속도 개선() (I 데이터에 따라, 2-5x 속도 향상을 본 적이있다, here은 ~ 15x 속도 향상을 보여주는 기사이며 구분 기호를 추측하는 것과 같은 일부 관리 작업을 처리하도록 설계되었습니다. read.csv 용 FREAD()
> # Libraries and options ---------------------------------------------------
>
> library(dplyr)
> library(data.table)
> # Helper parameters -------------------------------------------------------
>
> out_dir = "C:/Users/taylor/Dropbox/R_programming/stackoverflow/data"
> obs = 5e5
> # Create test data --------------------------------------------------------
>
> test_df = data_frame(
+ x = rnorm(obs),
+ y = 0.5 * obs + rnorm(length(x), 0, 0.25),
+ groups = rep(letters[1:5], length.out = length(x))
+)
> # export
> write.csv(test_df, paste0(out_dir, "/test_df.csv"), row.names = F)
> # clean memory
> rm(test_df)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 596408 31.9 1907703 101.9 10636178 568.1
Vcells 9301642 71.0 27768113 211.9 218137457 1664.3
> # For loop and read.csv (read.table alias) -------------------------------------
>
> system.time({
+
+ for(i in 1:20){
+ df = read.csv(paste0(out_dir, "/test_df.csv"))
+ write.csv(df, paste0(out_dir, "/test_df_export_original_example_", i, ".csv"), row.names = F)
+ }
+
+ })
user system elapsed
130.28 2.70 148.60
> # Lapply and read.csv -----------------------------------------------------
>
> # clean memory
> rm(df, i)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 596411 31.9 2185242 116.8 10636178 568.1
Vcells 9301647 71.0 27768113 211.9 218137457 1664.3
> system.time({
+
+ lapply(1:20, function(i){
+ df = read.csv(paste0(out_dir, "/test_df.csv"))
+ write.csv(df, paste0(out_dir, "/test_df_export_lapply_", i, ".csv"), row.names = F)
+ })
+
+ })
user system elapsed
123.33 2.07 140.03
> # Lapply and fread() ------------------------------------------------------
>
> system.time({
+
+ lapply(1:20, function(i){
+ df = fread(paste0(out_dir, "/test_df.csv"))
+ write.csv(df, paste0(out_dir, "/test_df_export_lapply_fread_", i, ".csv"), row.names = F)
+ })
+
+ })
user system elapsed
107.98 2.10 123.36
물론 교환 할 때이 경우에, 15 초 고속화가 : 하려던 http://paleocave.sciencesortof.com/2013 ([루프를 작성] 한/03/writing-a-for-loop-in-r /)? –
LaF 패키지를 사용해보고 특히 비 네트의 블록 처리 섹션을 읽으십시오. –