2017-02-09 2 views
1

큰 배열을 .csv 파일로 c로 작성하고 싶습니다. 병렬로 작성할 수 있습니까?C에서 입출력 작업을 병렬로 수행 할 수 있습니까?

OpenMP?

병렬 처리하려는 코드 조각은 파일의 일반적인 IO 작업입니다. resutVector1 및 크기 n의 resultVector2 감안할 때 ,

fp=fopen("output.csv","w+"); 
for(i=0;i<n;i++){ 
    fprintf(fp,"%f,%f\n",resultVector1[i],resultVector2[i]); 
} 
fclose(fp); 
+2

물론 _text 파일 _은 본질적으로 순차적 인 데이터 구조라는 것을 알고 있습니까? – AlexP

+0

벡터에서 순서를 유지하려면 가능하지 않을 것으로 예상됩니다 (적어도 제안한 코드 행에는 해당되지 않음). 아직도 스토리지에 글을 쓰는 것은 내가 알고있는 아키텍처에 대한 순차적 인 프로세스입니다. 그래도 내가 틀렸다고 입증되면 좋겠다. –

+0

별도의 쓰레드 나 포크 (프로세스)에서 쓰는 경우에는 각 라인이 원자적인 방식으로 작성되었는지 확인하기 위해 '뮤텍스 (mutex)'를 사용할 수 있습니다. 그러나 각 쓰기 사이에 수십 또는 수백 개의 작업을 수행하지 않는 한 뮤텍스가 사용 가능할 때까지 기다리는 데 시간을 할애해야합니다. 조숙 한 최적화를 피하는 것이 좋습니다. – KevinDTimm

답변

2

당신은 하나의 파일에 병렬 쓰기를 수행하려는 문제의 번호로 실행하는 것입니다.

w +는 쓰기 작업 이전에 기존 파일을 길이 0으로 절단하거나 새 파일을 만듭니다. 어떻게 병렬 파일 포인터 작성을 조정할 예정입니까?

글쓴이가 여러 명인 경우 쓰기를 동기화해야하며 순차 쓰기에 비해 속도면에서 유리합니다. 사실, 단일 전용 순차 쓰기 스레드보다 동기화 오버 헤드로 인해 속도가 느려질 수 있습니다.

질문에 대해 조금 더 생각해보십시오. 거대한 배열이 있다면 5 억 개의 정수를 말하면서이 배열을 영구 파일에 읽고 쓸 수있는 가장 빠른 방법이 정말로 필요했습니다. 배열을 할당 할 수있는 전용 스레드의 수로 나눌 수 있고, 각 세그먼트를 별도의 파일에 쓸 수 있습니다. 그런 다음이 데이터를 병렬로 읽음으로써이 배열을 배열로 다시 읽을 수 있습니다. 이 경우 Parallel For 유형의 패턴을 사용할 수 있으며 단일 파일에 대한 동기화 잠금 오버 헤드를 피할 수 있습니다.

그래서 내가 준 예제에서는 4 개의 스레드가있는 경우 각 스레드가 자체 분기를 작성하거나 별도의 파일에서 읽고 쓰는 배열 분기를 나눕니다.

참고 : 모든 파일이 동일한 디스크 드라이브에있는 경우 디스크의 다른 부분에서 여러 개의 동시 읽기/쓰기 작업을 수행하면 일부 I/O 속도가 느려질 수 있습니다. 이 효과는 각 파일을 다른 디스크/서버에 저장할 수있는 경우 중재 될 수 있습니다.

+0

글쎄, HDF5 파일은 [parallel] (https://support.hdfgroup.org/HDF5/PHDF5/)에서도 읽을 수있는 것 같습니다. [Lustre] (http://lustre.org/) 및 [XIOS] (http://forge.ipsl.jussieu.fr/ioserver/wiki) – Marouen

+1

@MarouenBenGuebila 맞습니다.하지만 HDFS 파일은 모 놀리 식 파일이지만 여러 파일로 나뉘며 병렬 읽기를 사용하여 동시에 다시 읽을 수 있습니다. 이것이 제가 위에서 설명한 해결책입니다. 어레이를 서브 섹션으로 나눌 수 있고 각각을 자신의 파일로 구분할 수 있으며 병렬 읽기를 통해 이들 파일을 동시에 읽을 수 있습니다. 병렬 라이브러리를 지원하고 여러 프로세서가있는 모든 OS에서이 작업을 수행 할 수 있습니다. –

1

당신은 2 개의 파일을 열어서 각 파일을 자체 파일에 쓸 수 있습니다. 그러나이 코드는 도움이되지는 않을 것입니다. 플랫폼에 의존한다고 생각합니다. 게다가 같은 파일에 둘 다 필요하다면 함께 복사해야하는데 다시 시간이 걸립니다.

또한 하드 드라이브 자체에 대한 쓰기가 여기 병목 일 가능성이 있으므로 하드 드라이브에 버퍼를 채우는 속도를 높일 필요가 없습니다.

두 개의 다른 하드 드라이브에서 두 개의 파일을 열 수 있지만 여전히 실제 속도가 향상되는 것은 의심 스럽습니다.

1

이 질문을 통해 pthread 라이브러리를 사용하여 구현 된 병렬 읽기 방법 pread을 작성했습니다. 파일 크기가 FILESIZE이고 스레드 수가 n이라면 pread 메서드는 입력 파일을 대략 동일한 크기의 FILESIZE/n 청크로 분할하고 각 청크를 스레드에 할당합니다. 그런 다음 각 스레드는 사전 정의 된 BUFFFERSIZE이있는 파일의 서로 다른 오프셋에서 fread을 사용하여 파일 읽기를 시작합니다. 구현 here을 찾을 수 있습니다.

이것은 지속적인 구현이며, 아직 병렬 쓰기 측에서 작업 중입니다.