2011-02-17 2 views
0

MySQL과 통신하는 PHP로 작성된 알고리즘이 있습니다. 표준 공유 호스팅 서버에서 계산하는 데 약 5 초가 걸립니다. 내 질문은 - 알고리즘의 자체를 변경하지 않고 속도를 올리거나, 전용/VPS를 사용하거나, 일부 클라우드 컴퓨팅을 사용하거나 ... 어떻게 할 수 있습니까?클라우드 컴퓨팅 - PHP 및 MySQL

의견을 보내주십시오.

편집 : 대중 교통을위한 Dijkstra 알고리즘입니다. 나는 유일한 3500 개의 정류장이있다.

간단히 말해서, 활성 중지, 이전 정지, lineToStop, totalTime, travelTime 등을 기록하기위한 여러 배열이 있습니다. 나는 정지 수를 반복하고, 정지의 ID를 얻고, 다른 정지 (활성 정지 시간을 기준으로)에 대한 연결을 구축하고, 정지()의 크기에 대해 다시 루프를 수행하여 가장 낮은 값을 가진 루프를 찾고, 활성화 된 후 다시 계속하십시오.

나는 그렇게 optimizatio 문제의 실현 ->Dijkstra algorithm optimization/caching

+1

흠, 자세한 내용 없이는 내 첫 제안은 MySQL 쪽에서 테이블을 최적화 할 수 있습니까? 즉 인덱스 등등? – Brian

+0

9/10 번 테이블에 올바른 인덱스를 정의하지 않았기 때문에 느린 쿼리입니다. 어떤 종류의 호스팅을 사용하여 데이터베이스를 실행해도 문제가되지 않지만 올바른 스키마를 만들고 쿼리를 프로파일 링해야합니다. –

+1

@ Dan Grossman : 또는 단단한 루프로 실행되는 빠른 쿼리입니다. for ($ i = 1; $ i <100000; $ i ++) {mysql_query ("select id from blah"); }'또는 공유 호스팅에 과부하가 걸렸습니다. 또는 파이프가 너무 얇습니다. 누가 알아? (그러나 일반적으로 최적화되지 않은 쿼리는 매우 일반적입니다. 예 : – Piskvor

답변

7

항공권을 구입할 때 첫 번째 질문은 "어디로 가고 싶니?"가 아닙니다. - "에서 어디로 가고 있습니까?" 다른 말로 표현하자면,별로, 많이는 아니지만, 우리는 단지 추측하고 있습니다.

"어떻게 속도를 높일 수 있습니까?" 어떤 경우에 이것이다 :

측정가, 실제 병목을 찾을 병목 현상을 제거, 그것은 충분히 실행될 때까지 반복합니다.많은 프로그래머 세기 사람 상상 무엇을 최적화 보냈다 -

프로파일 링하지 않고, 당신이 어떤 성능이 크게 영향을 미치지 않는 코드의 일부를 최적화 끝없는 시간을 낭비 할 수있다 ("실제 병목 현상"에 중점을 참고 병목 일 수 있음).

예 : 프로그램 시작시 한 번 호출되고 프로그램이 디스크 입출력을 기다리는 시간의 90 %를 소비하는 경우 메서드를 1000 % 빠르게하는 것은 무의미합니다. 또 다른 예로 : 프로그램이 복잡한 인덱싱되지 않은 쿼리를 실행하는 SQL 서버를 기다리는 시간의 90 %를 소비 할 때 I/O 병목 현상을 방지하는 디스크 배열 만들기. 그것들은 당신이 만날 수있는 유일한 문제가 아니며 상호 배타적이지 않습니다. - 그러나 당신은 하나의을 풀기 전에 어떤 문제가 있는지 알아야합니다. "천천히"는 문제에 대한 설명이 아니라 단지 증상 ("두통"이 9000 가지의 다른 건강 상태의 증상 일 수 있음)입니다.


TL; DR : There is no silver bullet.

+0

당신은 그 말을 아주 잘합니다. 주목할만한 단어입니다. Thx 4 도움말 Piskvor! – JackLB

0

알고리즘에 따라, 그리고 병목 PHP 코드 나 데이터베이스에 있는지 여부를 예를 들어 힙합을 facebooks처럼, 당신은 PHP를 컴파일러를 사용하여 시도해 볼 수도 있습니다 : http://developers.facebook.com/blog/post/358/

트래픽이 많지 않고 한 번 실행되는 알고리즘이 더 빨라야하므로 PHP 컴파일러 (필자가 링크 한 것과 같은)가 필요합니다. (bcompiler 또는 similair와 같은) opcode cacher는 많은 스크립트를 실행할 때만 도움이되기 때문에.

캐시 된 opcode는 스크립트 구문 분석의 속도를 높여 주지만, 스크립트의 5 초 실행 당 한 번만 발생하며 병목 현상은 없습니다. 그러나 컴파일러는 PHP 코드를 네이티브 어셈블리로 변환합니다.이 어셈블리는 PHP와 동등한 속도로 변하지는 않더라도 PHP에서 runnning보다 평균 2 배 빠릅니다.

다시 말하면 디자인에 따라 다릅니다. 스크립트가 단지 5 초 동안 대부분의 데이터베이스를 대기하는 경우 컴파일 작업이 도움이되지 않습니다.

여기에 어떤 종류의 알고리즘이 사용됩니까?

+0

알 수없는 알고리즘에 대해 특정 숫자, 특히 *에 대해 이야기하고 있으므로 인용문이 필요합니다. 우리가 알고있는 모든 것에 대해 'sleep (5)'이 될 수 있습니다. – Piskvor

+1

따라서 "depends"라는 단어를 두 번 사용합니다.) – Cray

1

"클라우드 컴퓨팅"은 계산을 향상시킬 수있는 마술이 아닙니다. 그것은 기술이고 극적으로 그것을 사용하기 위해 당신의 알고리즘을 재 작성해야 할 것이고 아마도 대부분의 SQL 데이터베이스를 사용하지 않아야 할 것입니다.

나는 알고리즘을 최적화하고 db 서버를 조정함으로써 훨씬 간단한 방법이라고 생각합니다. 나는 전통적인 최적화 방법을 사용함으로써 그러한 시간이 10 배 이상 감소 될 수 있다고 확신한다. 너 이미 사용 했니, BTW?

2

먼저 병목 현상이 어디에 있는지 찾아야합니다. 프로파일 러 (xdebug)를 사용하여 PHP의 느린 속도를 확인하십시오. 대다수의 시간이 MySQL 또는 처리를 수행중인 MySQL 또는 다른 것에 대한 연결을 기다리고있을 수 있습니다. 속도 저하가 실제로 알고리즘 코드에있는 경우, 옵션이 알고리즘을 변경합니다. 원하지 않는 알고리즘입니다. 또는 처리 능력을 더 확보하십시오. 그러나 나는 더 정확히 처리하기 위해 먼저 느린 부분을 정확히 찾아 낼 것입니다.

1

루프 내에 데이터베이스 쿼리가 있습니다. 한 번만 모든 행을 얻으려고했는데 결과를 메모리에 반복 했습니까? 1 페이지로드에서 3500 개의 쿼리를 작성하는 경우 속도가 더 빨라질 수 있습니다.

+0

. Dijkstra의 알고리즘은 모든 노드 이완에 대해 데이터베이스 조회가 필요한 경우보다 메모리 내에서 실행 속도가 훨씬 더 빠릅니다. –