2012-07-02 3 views
4

저는 루비 웹 서버와 C++ 프로세스가 호스팅되는 리눅스 머신을 가지고 있습니다. 두 구성 요소는 동일한 데이터베이스에서 작동합니다.루비와 C++간에 메모리를 공유 할 수 있습니까

반복되는 데이터베이스 요청을 피하기 위해 개체 모델을 만들고 유지 관리하려고합니다.

하나의 객체 모델을 만들어 루비 서버와 C++ 프로세스간에 공유 할 수 있습니까? 그렇다면 장단점은 무엇일 수 있습니까?

+1

이 질문을보십시오. http://stackoverflow.com/questions/1542520/how-can-i-call-c-functions-from-within-ruby –

+0

ruby에서 C++ api를 호출하는 것은 옵션입니다. 처음에 내가해야하는 API 함수의 수에 관심이 있었지만 노출 된 것을 제어 할 수있는 방법으로 더 나은 방법이 될 수 있습니다. – Schu

답변

3

요약하면; 당신은 별도의 임의의 프로세스의 메모리를 읽을 수 없습니다. 두 프로그램을 다시 컴파일 할 수 있다면 ptrace을 사용하여 메모리 공유/IPC를 구현할 수 있습니다.

그러나 나는 memcached을 조사 할 것을 권합니다. 그것은 데몬 (원하는 경우 로컬)으로 실행되며 매우 빠른 이름 - 값 캐시를 제공하므로 어떤 용도로든 사용할 수 있습니다. 레일 시스템에서 값 비싼 계산 결과를 캐싱하는 데 사용합니다.

+2

Redis를 사용해 보는 것도 좋습니다. 그것은 Memcached와 비슷한 키 - 값 메모리 내 저장 장치입니다. –

+0

memcached가 좋아 보인다. 그러나 제 신청서에는 데이터베이스 대신 사용할 수있는 무언가가 필요합니다. – Schu

+0

Memcached에 결과를 저장하여 데이터베이스 히트 수를 크게 줄일 수 있습니다 (SQL의 해시처럼 단순함). 그러나 데이터베이스를 완전히 없애고 싶다면 Memcached (캐시)는 작업을위한 도구가 아닙니다. 데이터베이스보다 나은 데이터베이스를 찾는 일은 거의 없을 것입니다 : P – lynks

2

프로세스간에 메모리를 공유하려면 POSIX 프로그래머 매뉴얼에서 공유 메모리 (man shm.h)와 세마포어 (man sem.h)를 찾으십시오. 그것은 메모리를 C++과 Ruby 사이에서 공유 할 수있게합니다. 가장 간단한 방법은 아닙니다. Ruby에서 FFI를 shm.hsem.h으로 작성하고 공유 메모리 버퍼 (동기화를 위해 세마포어를 사용)를 통해 적절한 프로토콜을 구현해야합니다.

파이프, 소켓, RPC, MQ 및 심지어 DB와 같은 다른 IPC 기능을 사용할 수도 있지만 공유하는 대신 복사하는 것입니다.

+1

http://sysvipc.rubyforge.org/classes/SysVIPC.html에 보석이있는 것처럼 보입니다. –

관련 문제