2014-10-14 3 views
0

대용량 데이터 집합을 청크로 분할하려고합니다. 내 코드는 다음과 같습니다루프를 사용하여 R에서 대용량 데이터 청크 자동화

#Chunk 1 
data <- read.csv("/Users/admin/Desktop/data/sample.csv", header=T, nrow=1000000) 
write.csv(data, "/Users/admin/Desktop/data/data1.csv") 

#Chunk 2 
data <- read.csv("/Users/admin/Desktop/data/sample.csv", header=F, nrow=1000000, skip=1000000) 
write.csv(data, "/Users/admin/Desktop/data/data2.csv") 

#Chunk 3 
data <- read.csv("/Users/admin/Desktop/data/sample.csv", header=F, nrow=1000000, skip=2000000) 
write.csv(data, "/Users/admin/Desktop/data/data3.csv") 

가 내 데이터 세트의 행 수백만의 수백, 그래서 나는 덩어리를 많이 만들 필요하고, 정말 프로세스를 자동화하고 싶습니다. 각 후속 청크가 이전 청크보다 1,000,000 개 더 많은 행을 자동으로 건너 뛰고 파일이 "dataN.csv"(N은 이전 파일의 다음 번호를 나타냄)로 저장되도록이 명령을 반복하는 방법이 있습니까?

+1

물론 교환 할 때이 경우에, 15 초 고속화가 : 하려던 http://paleocave.sciencesortof.com/2013 ([루프를 작성] 한/03/writing-a-for-loop-in-r /)? –

+0

LaF 패키지를 사용해보고 특히 비 네트의 블록 처리 섹션을 읽으십시오. –

답변

1

다음과 같은 방법은? 위의 답변에

f<-"C:/Users/MyPC/Desktop/" 
for(i in 1:2){ 
    df <- read.table("C:/Users/MyPC/Desktop/df.txt", header=FALSE, nrow=5, skip=5*(i-1)) 
    file <- paste(f,sep="","df",i,".txt") 
    write.table(df,file) 
} 
+0

당신의 접근 방식을 시도하고 다음과 같은 오류 메시지가 나타납니다 :'type.convert (data [[i]], as.is = as.is [i], dec = dec, na.strings = character (0L))에서 잘못된 멀티 바이트 문자열 ''' – waxattax

+0

열이 어떤 종류의 데이터 세트가 구성되어 있는가? 'str (dataset)'을 제공 할 수 있습니까? – DatamineR

+0

첫 번째 버전은 사용자가 요구 한 것이 아닙니다. 수정 된 버전을 사용해보십시오. – DatamineR

0

몇 가지 개선 : 텍스트 파일로 결과를 저장, 두 번, 때마다 다섯 줄을 시연을 위해 나는 두 개의 열 및 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 
+0

예를 들어이 답변을 확장 해 주시겠습니까? 그리고 첫 번째 답변보다 개선 된 이유는 무엇입니까? – alexforrence

+0

@alexforrence 수정되었습니다. 누군가가 Google fread 대 read.table 또는 lapply 대 for 루프에 대한 조언을받은 후 5 분이 소요될 때 대답을 완성하는 데 필요한 20 분의 추가 시간을 내 인생에서 보내야하는 이유는 무엇입니까? 그 효과? –

+0

본질적으로 해답은 독자적으로 설 수 있어야합니다. 관련 토론은 [here] (http://meta.stackoverflow.com/a/276728/2690232) 및 [here] (http://meta.stackoverflow.com/a/285728/2690232)를 참조하십시오. – alexforrence