2014-09-05 3 views
0

저는 PHP를 사용하여 많은 데이터 처리 작업을 수행합니다 (다른 언어 및/또는 기술을 사용해야하는 곳으로 나가고 있음을 알고 있음).PHP 프로세스간에 메모리의 큰 배열을 공유 할 수 있습니까?

메모리로 찾는 ngram을 포함하는 배열을로드하는 PHP 프로세스로 엔티티 추출을하고 있습니다. 이 어레이는 3GB의 메모리를 사용하며 프로세스를 시작할 때마다로드하는 데 20 초 정도 걸립니다. 한 번 로컬 컴퓨터에서 생성하고 각 프로세스가 .json 파일에서로드합니다. 그런 다음 각 프로세스는 처리중인 텍스트를 토큰 화하고이 두 배열간에 array_intersect를 수행하여 엔터티를 추출합니다.

이 모든 프로세스를 실행하는 컴퓨터의 메모리에이를 미리로드 한 다음 모든 프로세스에서 리소스를 공유 할 수있는 방법이 있습니까?

PHP에서는 가능하지 않으므로 이러한 유형의 엔티티 추출을보다 효율적으로 수행하려면 어떤 유형의 언어/메소드를 연구해야합니까?

+1

인 메모리 DB 솔루션부터 시작하겠습니다. – raina77ow

+0

이러한 ngram이 포함 된 MEMORY 테이블의 MySQL에서 조회가 PHP에서 배열 조회와 비슷한 속도로 검색 될까요? 이것은 아마 ... 당신이 그것을 시험 할 때까지 ... 상황입니다. –

답변

1

배열이로드 된 후에 절대로 변경되지 않으면 pcntl_fork()를 사용하여 스크립트 사본을 포크 할 수 있습니다. copy-on-write 의미론으로, 그들은 모두 배열의 똑같은 메모리 카피로부터 읽는 것입니다.

그러나 배열이 수정되면 배열이 각 분기 된 자식의 메모리 공간에 복사되므로 엄청난 벌금이 부과됩니다. 어떤 스크립트가 조기에 일을 마치면 종료 될 것입니다. 즉, PHP 프로세스가 종료 정리를 시작하고, 어레이의 메모리 공간에 쓰기로 간주되어 복사를 일으키는 경우입니다.

1

귀하의 경우 가장 좋은 공유 방법은 읽기 전용 mmap 액세스 일 수 있습니다.

PHP에서 가능한지 모르겠습니다. 많은 언어를 사용하면 파일을 메모리로 mmap 할 수 있으며 운영 체제는 읽기 전용 맵을 공유 할 수 있다는 것을 깨닫기에 충분히 똑똑 할 것입니다. 또한 모든 것이 필요하지 않은 경우, 운영 체제는 메모리를 회수하여 필요에 따라 디스크에서 다시로드 할 수 있습니다. 실제로, 그것은 심지어 당신이 물리적으로 가지고있는 것보다 더 많은 메모리를 맵핑하도록 허용 할 수도 있습니다.

mmap은 정말 우아합니다. 그럼에도 불구하고 PHP에서 매핑 된 데이터를 처리하는 것은 어려울 것입니다. 일반적으로 PHP는 느립니다. 벤치 마크에서, PHP가 좋은 C 프로그램의 런타임 40-50 배에 도달하는 것이 일반적입니다. 이것은 예를 들어 자바는 좋은 Java 프로그램이 고도로 최적화 된 C보다 두 배나 느리다. 저수준의 C 코드를 디버깅하는 것과는 대조적으로 Java의 강력한 개발 도구를 갖출 수 있습니다. 하지만 PHP는 핵심적인 이점이 없습니다. 작성하기가 우아하지 않고 뛰어난 툴체인도 없으며 빠른 속도입니다.

관련 문제