2013-08-02 4 views
0

전제 조건이 두 개인 웹 사이트를 구축 중입니다. index.php 및 file.txt.PHP 파일 최적화 성능 최적화

File.txt에는 (현재) 10MB의 데이터가 있으며, 잠재적으로 최대 500MB가 될 수 있습니다. 사이트의 아이디어는 사람들이 index.php로 이동 한 다음 파일의 위치를 ​​찾을 수 있다는 것입니다. 또 다른 특징은 탐색 지점에서 최대 10kb의 데이터를 읽을 수 있다는 것입니다. 따라서 :

index.php?pos=432은 파일의 423 위치에 바이트를 가져옵니다.

index.php?pos=555&len=5000는 지금

위치 (555)에서 시작하여 파일에서 데이터의 5킬로바이트를 얻을 하루에 수천 개의 안타를 받고 사이트를 상상합니다.

나는 현재 fseekfread을 사용하여 데이터를 제공합니다. 이 작업을 수행하는 더 빠른 방법이 있습니까? 아니면 내 용도가 너무 낮아서 각 요청의 결과를 캐싱하거나 파일을 메모리에로드하고 거기에서 읽는 것과 같은 고급 최적화를 고려할 수 없습니까?

+0

인덱스가있는 데이터베이스 사용을 고려해야합니다. –

+0

그러나 파일의 데이터는 어떤 방법 으로든 수동으로 작성되지 않습니다. 말 그대로 문자와 숫자의 무작위 시리즈를 저장합니다. 응용 프로그램은 사용자의 요청에 따라 임의의 데이터 세그먼트 (최대 10kb)를 검색합니다. 그래서 누군가는 위치 10에서 1000 바이트를 요청할 수 있고 위치 11에서 1000 바이트를 요구할 수 있습니다. 결과는 거의 동일 할지라도 서로 다릅니다. 귀하의 데이터베이스 구현은 그것을 어떻게 다루겠습니까? – Ozzy

답변

0

몇 초당 수천 건의 조회수가 발생합니까? 이 시점에서 최적화가 필요하기에 너무 낮습니다. fseek와 fread를 사용하면 가장 쉬운 방법입니다.

+0

무슨 뜻인지 알 겠어. 아마 초당 몇 초가 될 것입니다. 최적화에 대해 걱정할 필요가 없다면 fseek와 fread를 계속 사용하겠습니다. 난 그냥 하드 드라이브에 병 목을 만드는 결국 끝내고 싶지 않아 사용자가 균등하게 사이트를 방문 시작하면 – Ozzy

+0

? 두 시간 동안 그들 대부분이 올 것이라면 어떨까요? –

+0

@ 유진 (Eugene) 모든 사용자가 1 분 이내에 사이트를 방문하더라도 디스크에 관한 한 중요하지 않습니다. 소비자 등급의 데스크탑 시스템조차도 초당 약 100 건의 디스크 검색을 처리 할 수 ​​있으며, 파일에 자주 액세스하면 실제로 디스크에 액세스하지 않고도 가상 메모리의 요청을 처리합니다. – Joni

0

모든 데이터를 파일로 유지하는 것이 중요한 경우 파일을 작은 파일 덩어리로 분할하는 것이 좋습니다.

예를 들어 파일 크기가 1MB 이상이어서는 안됩니다. 그것은 당신이 10 개 별도의 파일로 file.txt 파일을 분할해야 함을 의미 : 당신이 요청을 처리 할 때

, 당신이 결정해야합니다 ... file-1.txt, file-2.txt, file-3.txt 등 부문 pos 인수에 의해 픽업에 어떤 파일 적절한 크기의 데이터를 보여줍니다. 이 경우 fseek 기능이 더 빨리 작동합니다 ...

어쨌든 fseekfopen 기능을 사용해야합니다.

0

편집 : 지금은 당신이이 안 바이트 AA 특정 수를 얻을 수 fread()를 사용하여 다음 오프셋 바이트로 이동 fseek()를 사용하고 있습니다로 너무 오래, 그것을 고려하는 것이 문제. 웬일인지 나는 X 번호가 이라는 줄을 정말로 끔찍한 파일에서 읽었다.


문제는 당신이 절대적으로 IO 작업에 디스크를 망치, 그리고 당신은 단지 당신이 디스크 있음을 필요로 아무것도 성능 문제가 발생하고이 하나 개의 파일/스크립트 성능 문제가 발생하지 않을 것입니다 . 다른 사용자, OS 등 공유 호스팅을 사용하는 경우 시스템 관리자 중 한 명은 자신이 누구인지 파악하여 사용자를 끌 수 있음을 보증합니다. 당신은 방법을 찾아야

[나는 것]에서 다음 중 하나를 메모리에

  1. 오프로드이.
    파일을 메모리에로드하고 요청시 청크를 제공하는 서버에 데몬을 설정하십시오.
  2. mySQL과 같은보다 효율적인 것으로 오프로드하십시오.
    이미 예를 들어, 순차적 덩어리의 데이터를 제공하고 있습니다 :

    CREATE TABLE mydata (
        line INTEGER NOT NULL AUTO_INCREMENT, 
        data VARCHAR(2048) 
    ) PRIMARY KEY (line); 
    

    로 :

    SELECT data FROM mydata WHERE line BETWEEN 466 AND 476; 
    
476 라인 466은 같은 테이블에서 데이터를 검색하는 것이 훨씬 빨라집니다
0

파일이 절대 변경되지 않고 최대 크기가 정말로 제한적일 경우 ramdisk을 탑재하기 만하면 파일을 영구 저장 장치에서 RAM 저장 장치로 복사하는 부팅 스크립트가 있습니다.

아직 사이트가 아닌 경우이 사이트를 호스팅해야합니다.

이렇게하면 OS 파일 시스템 캐시에 의존하지 않고 파일 세그먼트가 메모리에서 제공된다는 것을 보증 할 수 있습니다.