2013-01-23 3 views
3

데이터가 디스크에 저장되어 너무 커서 메인 메모리에 저장할 수 없습니다. 스트리밍 문자 변환은 어떻게 수행합니까?

나는이 같은 iconv를 통해 데이터 처리 파이프 라인으로 디스크에서 데이터를 스트리밍 할

: 그것은 하나를 출력하기 전에 소진 될 때까지

zcat myfile | iconv -f L1 -t UTF-8 | # rest of the pipeline goes here 

를 불행하게도, 나는 전체 파일을 메모리에 버퍼의 iconv보고 있어요 데이터. 즉, 메모리 풋 프린트가 최소 인 파이프 라인에서 블로킹 동작에 대한 모든 주 메모리를 사용하고 있음을 의미합니다.

stdbuf -o 0 iconv -f L1 -t UTF-8 

를하지만의 iconv는 내부적으로 자체 버퍼링을 관리하는 것 같습니다 - 그것은 리눅스 파이프 버퍼와는 아무 상관 없습니다 :

나는 이런 식으로의 iconv 호출 시도했습니다.

이 글은 아치 리눅스에서 gblic 2.6과 2.7로 패키징 된 바이너리로 보입니다. 데비안에서는 glibc 2.5로 그것을 설명했습니다.

이 문제를 해결할 방법이 있습니까? 스트리밍 문자 변환은 간단하지 않지만, 일반적으로 사용되는 유닉스 도구가 스트림에서 작동 할 것이라고 생각했습니다. 주 메모리에 맞지 않는 파일을 다루는 일은 드뭅니다. libiconv에 연결된 내 바이너리를 굴려야합니까?

+1

이 질문을 유닉스 스택 교환에 넣어야합니까? 어쨌든 해결책은'recode' 명령 (gnu.org/software/recode)을 사용하는 것이 었습니다. – Cera

답변

2

iconv_open으로 iconv (3) 호출을 생각해 봅시다 - 두 개의 호출에 간단한 C 루틴을 연결합니다. stdin에서 읽기, stdout에 쓰기. 다음 예를 읽으십시오 :

http://www.gnu.org/software/libc/manual/html_node/iconv-Examples.html 

이 예는 사용자가 설명하는 것을 명백하게 처리하기위한 것입니다. - "stateful"데이터 대기를 피하십시오.

+0

감사합니다. 해결책을 찾지 못하면이 문제가 발생할 것이라고 생각했습니다. 고맙게도,'recode'는 그것을 분류했다. – Cera