2010-02-13 5 views
7

개체 묶음을 만들고 직렬화 한 다음 일반 텍스트 파일로 변환하는 프로세스가 있습니다. 이것은 Hadoop과 함께 작업하고 모든 출력물이 stdin 및 stdout을 통해 스트리밍해야하기 때문에 상황을 처리하는 좋은 방법처럼 보였습니다.R : 개체를 텍스트 파일로 직렬화 한 후 다시

내가 남긴 문제는 텍스트 파일에서 이러한 개체를 읽고 내 데스크톱 컴퓨터에서 R으로 다시 보내는 방법입니다. 다음은 도전 과제를 보여주는 작업 예제입니다.

tmp 파일을 만들고 단일 개체를 작성해 봅시다.

outCon <- file("c:/tmp", "w") 
mychars <- rawToChar(serialize(1:10, NULL, ascii=T)) 
cat(mychars, file=outCon) 
close(outCon) 

mychars 객체는 다음과 같습니다 :

A 
2 
133633 
131840 
13 
10 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

아마 해요 :

> mychars 
[1] "A\n2\n133633\n131840\n13\n10\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" 

텍스트에 기록하는 경우는 다음과 같습니다 파일이 객체는 벡터이다 뭔가 끔찍한 명백한 내려다,하지만 어떻게 다시이 파일을 읽고 개체를 unserialize합니까? scan() 또는 readLines()를 시도 할 때 줄 바꿈 문자를 레코드 구분 기호로 취급하고 텍스트 파일의 각 요소가 벡터 인 벡터로 끝납니다. 필자가 정말로 원하는 것은 파일의 전체 내용을 담은 텍스트 문자열입니다. 그런 다음 문자열을 비 직렬화 할 수 있습니다.

Perl은 줄 바꿈을 문자열로 다시 읽지 만 R이 줄 바꿈을 처리하는 방법을 재정의하는 방법을 알아낼 수 없습니다.

답변

7

JD, 우리는 digest 패키지에서 serialize()에서/raw을 통해이를 수행합니다. 직렬화 된 오브젝트를 SQL 및 다른 장소에 저장할 수 있기 때문에 유용합니다. 나는 실제로 이것을 RData로 저장할 것이고 이는 load() (파싱 안 함)과 save()에 더 빠르다.

또는, RawToChar() 수 있고 우리가 파일 복사의 직렬화를 비교할 경우 아스키는 help(digest)에서 바로 촬영이 뭔가를 (사용하는 경우 :

귀하의 예제이 될 것을 너무
# test 'length' parameter and file input 
fname <- file.path(R.home(),"COPYING") 
x <- readChar(fname, file.info(fname)$size) # read file 
for (alg in c("sha1", "md5", "crc32")) { 
    # partial file 
    h1 <- digest(x , length=18000, algo=alg, serialize=FALSE) 
    h2 <- digest(fname, length=18000, algo=alg, serialize=FALSE, file=TRUE) 
    h3 <- digest(substr(x,1,18000) , algo=alg, serialize=FALSE) 
    stopifnot(identical(h1,h2), identical(h1,h3)) 
    # whole file 
    h1 <- digest(x , algo=alg, serialize=FALSE) 
    h2 <- digest(fname, algo=alg, serialize=FALSE, file=TRUE) 
    stopifnot(identical(h1,h2)) 
} 

:

R> outCon <- file("/tmp/jd.txt", "w") 
R> mychars <- rawToChar(serialize(1:10, NULL, ascii=T)) 
R> cat(mychars, file=outCon); close(outCon) 
R> fname <- "/tmp/jd.txt" 
R> readChar(fname, file.info(fname)$size) 
[1] "A\n2\n133633\n131840\n13\n10\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" 
R> unserialize(charToRaw(readChar(fname, file.info(fname)$size))) 
[1] 1 2 3 4 5 6 7 8 9 10 
R> 
+0

필자는 내 객체를 원시 상태로 유지해야 했으므로 Hadoop에서 R을 사용하여 얻은 교훈을 함께 배울 때주의해야합니다. 필자가 놓친 부분은 readChar() 함수와 같습니다. 감사합니다. Dirk! –

+0

. 그리고 나는 물론 RProtoBuf 패키지를 연결하는 것을 잊어 버렸습니다! Windows 바이너리는 아직 없지만 R과 링크하기에 적합한 MinGW 빌드 버전이 없습니다. –

관련 문제