2016-11-03 1 views
0

저는 (realloc, tcmalloc) 동적 배열 (약 2-4 억 배)을 매우 빠르게 커졌습니다. 성장이 끝나면 두 개의 서로 다른 응용 프로그램간에이 배열을 공유하고 싶습니다. 공유 메모리 영역을 준비하고 풀 어레이를 복사하는 방법을 알고 있지만, 소스와 공유 대상 배열을 같은 순간에 유지해야하기 때문에 이것은 메모리에 너무 기발한 것입니다. 복사하지 않고 POSIX 모델 내에서 이미 존재하는 동적 배열을 공유 할 수 있습니까?Linux POSIX 모델 내에서 C 언어로 기존 동적 배열을 공유하는 방법은 무엇입니까?

편집 :

약간의 설명.

POSIX 모델 (shm_open() 및 기타) 내에서 메모리 할당을 사용할 수 있지만 그렇게 할 경우 이미 공유 메모리 세그먼트를 여러 번 다시 할당해야합니다 (데이터베이스에서 행으로 숫자를 메모리로 읽음). 간단한 realloc()과 비교할 때 오버 헤드가 훨씬 더 큽니다.

데이터베이스에서 읽고 공유 메모리에 기록하는 한 명의 제작자가 있습니다.

얼마나 많은 레코드가 데이터베이스에 있는지 알 수 없으므로 할당 전에 공유 배열의 크기를 알 수 없습니다. 이런 이유로 프로듀서가 데이터베이스에서 행 단위로 읽는 동안 큰 배열을 재 할당해야합니다. 메모리가 공유되고 채워지면 다른 응용 프로그램이 공유 배열에서 데이터를 읽습니다. 때때로이 큰 공유 배열의 크기를 변경하고 새로운 데이터로 보충 할 수 있습니다.

+0

*에 * 대한 컴퓨터의 메모리는 모두 무엇입니까? –

+0

DB에서받은 수학 계산을위한 약 20 억 (배)의 배열. –

+1

16GB 또는 32GB RAM의 가격은 얼마입니까? RAM을 적게 사용하려면 코드를 작성하는 데 얼마의 비용이 듭니까? –

답변

2

복사하지 않고 POSIX 모델 내에서 이미 존재하는 동적 배열을 공유 할 수 있습니까?

아니요, 공유 메모리가 작동하는 방식이 아닙니다. shm_overview(7) & mmap(2)을 읽으십시오.

20 억 개의 복식을 복사하는 데 몇 초가 걸릴 수 있습니다.

아마도 mremap(2)을 사용할 수 있습니다.

BTW, POSIX 공유 메모리의 경우 대부분의 컴퓨터는 shm_open(3)으로 공유되는 세그먼트의 크기를 몇 메가 바이트 (기가 바이트가 아님)로 제한합니다. 경험적으로 최대 공유 크기 (전체 컴퓨터)는 사용 가능한 RAM의 절반보다 훨씬 적어야합니다.

내 생각에 디자인이 부적절하고 사용자의 경우 공유 메모리를 사용하지 않아야합니다. 해결하고자하는 문제와 데이터가 어땠는지 설명하지 않았습니다. (RDBMS을 사용해 보셨습니까?) synchronization 문제는 무엇인가요? 당신이 정말로 더 설명해야하므로

귀하의 질문은 훨씬 더 그것을 동기를 부여, 일부 XY problem처럼 많은 냄새와 는 광범위하고 높은 수준의 사진을 제공합니다.

+0

내 일반적인 질문에 대한 답변을 확대 해 주셔서 감사합니다. 나는 너의 대답을 준비하는 데 시간을 할애해야한다. –

+0

질문을 개선하고 전반적인 동기 부여를 위해 시간을내어주십시오 (어떤 종류의 응용 프로그램을 염두에 두 었는지 자세히 설명해주십시오) –

관련 문제