2013-07-04 1 views
4

나는 동시에 열어 사용하는 전략적 질문이있다 fstream s. 너무 많은 양의 파일을 읽는 프로그램을 작성해야합니다. 각 파일에는 식별자 묶음에 대한 정보가 있지만 한 번만 있습니다. 이 정보를 계산하고 각 식별자별로 별도의 파일에 저장해야합니다. 모든 식별자는 여러 파일에 나타나며 매번 동일한 파일에 저장해야합니다 (한 번에 여러 식별자 사용). 수백 개의 식별자가 필요하므로 동시에 수백 개의 filesteams를 열어야합니다.동시 filestreams의 limiltation가 있습니까?

동시 파일 스트림에는 제한 사항이 있습니까? 또는이 작업을 수행하는 다른 방법을 제안합니까?

프로그램은 엄청난 양의 데이터 (약 10GB 이상)를 계산하고 아마도 몇 시간을 계산합니다.

감사

답변

5

은 궁극적으로 무엇에 한계가있다. 파일은 운영 체제에서 관리하는 파일의 완벽한 예이며 특정 제한은 OS 설명서를 참조해야합니다. Linux에서는 커널에서 구성 가능하다고 생각합니다. 사용자 및 프로세스 할당량이 추가로있을 수 있습니다.

200 명이 너무 많다고 생각하지 않습니다.

시도하고 보는 것은 매우 간단합니다. 오류가 발생할 때까지 더 많은 파일을 열어 두는 프로그램을 작성하십시오.

실례입니다. 맥 OS X 10.8

이 프로그램

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 

int main() { 
    int i = 0; 
    std::ofstream *f; 
    do { 
     f = new std::ofstream(std::to_string(i ++)); 
    } while (* f << "hello" << std::flush); 
    -- i; // Don't count last iteration, which failed to open anything. 

    std::cout << i << '\n'; 
} 

출력 253를 생성. 따라서 Mac을 사용한다면 황금색입니다. :)

+6

, 유형은 'ulimit를 당신의 한계를 찾기 위해 명령 줄에서 -a'. 예를 들어,'열린 파일 (-n) 8192'을 볼 수 있습니다. 따라서 필자의 한계는 파일 설명자를 동시에 열 수 있습니다 (또는 ulimit -n을 사용하면 도움이되는 텍스트없이 숫자 만 볼 수 있습니다). – BoBTFish

+0

감사합니다. – FThewes

+0

아, 밥의 대답은 너무 맥에서 작동) 는 실제 프로그램에서 작동하지 않는 간단한 테스트를 제공하는 것보다 부탁의 더 나은 생각. 그것은 256이라고 말하며, 한 쌍은 표준 입력과 출력을 위해 취해진 것입니다. – Potatoswatter

0

동시에 열 수있는 fstream에는 제한이 없지만, os는 동시에 열 수있는 파일 수를 제한합니다. 몇 백개의 파일이 일반적인 OS에는 너무 많은 것 같지 않지만 모든 정보를 미리 읽을 것을 제안합니다. (한 번에 여러 파일을 열어 볼 수도 있지만 "open"을 호출 할 가능성을 고려하여 실패 할 수 있습니다. 이 경우 이전에 열린 파일 중 일부를 닫은 후에 다시 시도해야합니다.) 그런 다음 처리를 수행하고 일부 내부 데이터 구조에 결과를 저장하십시오. 마지막으로 결과를 다시 파일에 다시 쓸 수는 있지만 병렬 방식으로 다시 시도 할 수는 있지만 다시 파일을 열지 못했습니다.

+0

한계가있는 경우 제한이없는 이유는 무엇입니까? – Potatoswatter

+0

fstream을 만드는 것은 파일을 여는 것과 다릅니다. fstream은 std 라이브러리의 "개념"입니다. std 라이브러리는 생성 할 수있는 fstream 수에 제한을 두지 않으며 "동시에"호출 할 수있는 fstream 수에도 제한을 두지 않습니다. 파일을 열려고 할 때 (fstream이나 다른 수단을 통해) 파일을 보려고 할 때 사용할 수없는 리소스가 있는지 물어 봅니다. os가 사용 가능한 파일 설명자의 수를 제한 할 수 있으므로 주어진 수의 파일을 열려고 시도 할 경우 항상 실패합니다. –

1

C++ 표준에서는 동시에 열어 볼 수있는 파일의 수를 제한하지 않으며, 내가 본 것으로 생각하는 파일의 수를 제한하지 않습니다.

C++ 라이브러리의 특정 구현에는 제한이있을 수 있습니다 (문서화 될 수도 있고 문서화되지 않을 수도 있음). 운영 체제에는 전체 시스템에 대한 제한이 있고 프로세스 당 또 다른 제한이있을 가능성이 큽니다. 이러한 한계는 다양하므로 쉽게 알 수있는 방법이 없습니다. 또한 시스템 소유자가 구성하는 다양한 설정을 통해 인위적으로 낮출 수도 있습니다.

그리고 그러한 제한이 무엇인지 알더라도 상황에 따라 달라지는 동적 제한이있을 수 있습니다. 예를 들어 전체 시스템에서 16384 개 파일을 열 수 있고 프로세스 당 제한은 1000 개, C++ 라이브러리 1024를 허용하면 운영 체제가 중요한 데이터 블록을 할당 할 수있는 메모리가 없으므로 단일 파일을 열지 못할 수 있습니다.

+0

"얼마나 적은가". 나는 "Implementation quantity"부록을보고 관련성이없는 것을 보지 못했습니다. – BoBTFish

+0

@BoBTFish 확인해 주셔서 감사합니다. –

0
  1. OS를 동시에 열 수있는 파일의 수에 제한을 부과 할 수 있습니다. 유닉스 계열 시스템 (linux, * bsd 등)은 분명히이 한계가 있으며 구성 가능합니다. Windows의 구성 가능한 한계는 비슷합니다.
  2. 운영 체제에 따라 2^(8*sizeof(filehandle)) 개 이상의 다른 파일을 열 수 없습니다. filehandle은 파일 내용에 액세스하는 데 사용되는 유형입니다. HANDLE, FILE *, int 등 운영 체제에 따라 다릅니다. 하지만이 한계에 도달하기 전에 메모리가 부족할 것입니다.
  3. Windows C 런타임 라이브러리 (stdio, fprintf 및 이와 유사한 기능을 제공하는 stdio)는 한 번에 512 개의 파일을 열 수 없지만이 수는 2048까지 늘릴 수 있지만 그 이상은 할 수 없습니다. _setmaxstdio을 참조하십시오. 결과적으로 fstream이 cstdio를 후드에서 사용하면 fstream에도 동일한 제한이 적용됩니다.
  4. 사람들 32 창문에 XP를 하나의 프로세스는 65535 개 이상의 파일을 열 수 없습니다 말한다. 그러나이 정보는 소문이지만 msdn 설명서에서 지원하지 않는 것 같습니다. 이는 아마도 잘못된 것임을 의미합니다.
  5. Linux의