2012-05-14 6 views
1

posix 시스템의 표준 라이브러리를 사용하여 잠재적으로 매우 큰 문자열을 C 프로그램으로 임시 저장하는 적절한 방법을 찾고 있습니다. 문자열은 C- 함수의 선형 적 출력의 절정입니다. 이 함수를 마지막으로 호출 한 후 데이터를 더 처리 (출력)하고 싶습니다. 방대한 양의 메모리를 할당하는 것과 임시 파일을 만드는 것 사이에 간단한 절충이 있습니까? 예를 들어, 파이프에 쓰고 데이터가 필요하면이 파이프에서 다시 읽는 것을 상상할 수 있습니다. 그러나이 경우 내부적으로 데이터를 처리하는 방법과 임시 파일보다 데이터를 처리 할 방법이 확실하지 않습니다.긴 문자열 데이터의 임시 저장

답변

1

주로 데이터를 사용하여 수행해야하는 작업에 따라 달라집니다. 임의로 (예를 들어 정렬해야하는 경우) 무작위로 액세스해야하는 경우 잠재적으로 많은 양의 메모리를 사용하는 비용에도 불구하고 파일이 모두 메모리에 있으면 훨씬 쉽습니다.

데이터를 처리하기 위해 순차적으로 데이터에 액세스 할 수 있다면 일반적으로 데이터가 클 것으로 예상되는 경우 임시 파일을 권장합니다.

메인 스레드가 파이프를 쓰는 동안 파이프에서 데이터를 읽는 다른 스레드를 생성하지 않으면 파이프가 도움이되지 않습니다. 그렇지 않으면 파이프의 버퍼를 채우고 차단합니다 (교착 상태, 사실).

+0

데이터는 길고 짧을 수 있습니다. 대개의 경우 단일 행이되지만 최악의 경우에는 사용 가능한 실제 메모리를 초과 할 수도 있습니다. – highsciguy

+0

데이터를 무작위로 액세스 할 필요는 없지만 출력에 데이터가 필요할 때마다 임시 파일을 읽고 닫을 때 오버 헤드가 발생하여 느리게 표시됩니다. 데이터가 생성되는 동안 데이터에 액세스 할 필요가 없습니다. 그래서 파이프에 쓰고 닫은 다음 다시 열어서 읽을 수는 있지만이 경우에는 파이프의 데이터가 어떻게되는지 잘 모르겠습니다. 나는 그것이 읽을 때까지 끈기가 있다고 생각한다. 하지만 그것은 임시 파일에 저장되어 있습니까? – highsciguy

+0

일반적으로 데이터가 짧지 만 가끔 길 경우, 특정 크기 임계 값을 초과하여 임시 파일로 이동할 때까지 메모리에 버퍼링 할 수 있습니다. 코드에서 두 경우 모두 처리해야하기 때문에 더 많은 작업이 필요합니다. 필요에 따라 오버 헤드를 허용하고 항상 임시 파일을 사용하는 것이 더 간단 할 수 있습니다. – Celada

0

메모리에 보유하거나 디스크에 기록할지 여부에 따라 결정할 수 있습니다 (귀하의 의견에 따라 케이스별로 결정해야합니다). 데이터가 특정 임계 값 이상으로 증가한 것을 알게되면 디스크에 기록하고 나머지 데이터를 넣을 방법을 전환합니다.

파이프는 매우 작은 저장 공간 크기 (Linux 2.6 이후 2.4, 2.4에서 AFAIR보다 적게 - 4 kiB 정도)의 프로세스 간 통신 방법이므로 좋은 생각이 아닙니다.

+0

물론! 그러나 이것을하기위한 표준 방법이있는 것처럼 보입니다. – highsciguy