2013-01-15 2 views
1

큰 파일 핸들러를 구현해야하는 PHP 용 애플리케이션을 개발 중입니다. 파일 읽기 및 쓰기는 문제가되지 않지만 파일의 내용을 확인하는 것은 문제가됩니다.큰 배열을 처리하는 방법은 무엇입니까?

변수가 이미 동일한 문서에서 사용되었는지 확인하는 재귀 함수를 만들었습니다.

private function val_id($id){ 
    if(!isset($this->id)){ 
      $this->id = array(); 
     } 
    if(in_array($id, $this->id)){ 
     return $this->val_id($id+1); 
    }else{ 
     $this->id[] = $id; 
     return $id; 
    } 
} 

와 in_array ($ 아이디, $ this-> ID)는 FALSE를 반환

은 $ ID는 $ this-> ID와 유효 ID를 리턴한다 (모든 식별자를 포함 어레이)에 추가 될 것이다. 이 TRUE 반환하면

, 그것은 (1) 우리는 300,000 이상에 대해 이야기하고 있기 때문에

는 시간을 기록 + 매개 변수 $ ID를 가진 동일한 기능을 반환 PHP는 큰 배열을 저장할 수하지 않을 것입니다. 이 배열이 너무 커지면 생성하는 문서에 줄을 쓰지 않는 것 같습니다. 그러나 그런 오류 메시지는받지 못합니다.

생성 된 문서가 여러 행을 가진 SQL 파일이므로 다른 솔루션을 삽입하면 ID가 이미 데이터베이스에 있는지 확인할 수 있습니다. MySQL이 이러한 예외를 잡아서 id에 1을 추가하여 이러한 항목을 다시 시도 할 수 있습니까? 방법?

이 문제를 어떻게 해결할 필요가 있다고 생각하십니까?

종류와 관련,

WOUTER

+0

PHP가 배열을 저장하는 더 압축 된 방법을 찾으려면 [PHP Judy] (http://php.net/Judy)를 확인하십시오. 결과는 공간적으로 인상적이지만 일반적인 배열 구현 (그것을 채우기 위해)보다 두 배 느린 것처럼 보입니다. –

+0

코드를 좀 더 보여줄 수 있습니까? 파일을 쓰고있는 곳은 어디입니까? 여기서하려고하는 것을 말하기는 어렵습니다. mysql의 auto_increment를 사용하여 여러분이하려는 일을 해결할 수 있다는 느낌이 들었습니다. – sgroves

+0

방금 ​​읽은 것, 어쩌면 도움이 될 수 있습니다 : http://blog.webspecies.co.uk/2011-05-31/lazy-evaluation-with-php.html –

답변

1

사용 INSERT IGNOREisset($array[$this->id])를 사용 할 수 있습니다 PHP에서. 귀하의 진술은 다음과 같을 수 있습니다.

INSERT IGNORE INTO tbl_name SET key1 = 1, col1 = 'value1' 

당신은 항상 당신이 하나 키를 증가 ON DUPLICATE KEY를 사용할 수있는 ID에 1을 추가하려면 :

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 
1
  1. 메이크업 오류 메시지가 나타날 수 있습니다.
  2. 증가하는 대신 값의 memory_limit
  3. 키에서 매개 변수를 저장 - 그래서 당신은 MySQL의에서 중복 키 체크를 해제하고 키 체크를 제거하는 대신 in_array()
+0

은 키가 해시 맵에 저장되어 있기 때문에 O (ln (n))이고, in_array는 설명하기 위해 O (n) (전체 배열을 보자)가 필요합니다. –

+0

@FabianBlechschmidt - 게시 한 내용의 추론을 설명하는 댓글입니까? 이 방법은 누군가를 도우려는 의도가없는 e-peen처럼 보이게 만듭니다. –

+0

미안하지만, 할 일이 너무 많아서 몇 초만 쓰면됩니다.하지만 당신 말이 맞습니다. O는 이론적 인 컴퓨터 과학의 기능입니다. http://en.wikipedia.org/wiki/Big_O_notation O (n)은 배열의 모든 키 <-> 값 쌍을 한 번 터치해야만 원하는 것을 얻을 수 있음을 의미합니다. 값), O (ln (n))은 ln (n) 값을 터치하기 만하면됨을 의미합니다. 즉, 나무 아래로 내려 가야하므로 많은 시간을 절약 할 수 있고 필요없는 키를 만질 수 있습니다 검색된 –

0

왜 30.000 기록이 문제가되어야 하는가? 표준 PHP 배열의 각 레코드는 144 바이트를, 30.000은 4218,75 kByte를 의미합니다. 별거 아니야.

그렇지 않으면 배열 키를 사용하는 상식의 아이디어가 더 빨리 생각할 가치가 있습니다.

관련 문제