Views 3 통합 기능이있는 Drupal 7을 사용하여 대용량 플랫 파일 데이터 소스 가져 오기


13

내 목표는 뷰 3을 사용하여 쿼리 할 수있는 Drupal 7을 사용하여 몇 개의 매우 큰 플랫 파일 데이터 소스 ( CSV , 고정 너비 및 XML 문서)에 포함 된 읽기 전용 데이터 에 액세스하기위한 빠르고 안정적이며 자동화 된 방법을 생성하는 것입니다. 구성 단위. 이미 사용 가능한 모듈을 사용하고 싶지만 사용자 정의 모듈을 작성하는 것도 옵션입니다.

작업에 적합하지 않은 모듈과 방법을 배제하기 위해 작업중 인 파일에 대한 통계는 다음과 같습니다.

  • 연간 수입량 : 8,500,000 행 CSV 파일. (연간 삭제 및 재로드. 기본 키가 있습니다.)
  • 주간 가져 오기 : 350,000 줄 고정 너비 파일. (매주 삭제 및 다시로드되었습니다. 기본 키는 없습니다 .)
  • 시간별 가져 오기 : 3,400 줄 CSV 파일. (가능한 한 자주 업데이트하고 동기화하길 원하지만 매 20 분을 넘지 않아야합니다. 기본 키가 있습니다)
  • 일일 가져 오기 : 200 개의 항목 XML 파일. (매일 삭제 및 새로 고침. 기본 키가 있음)

세 가지 형식 간 변환은 문제가되지 않으며 가져 오기 성능을 향상 시키거나 더 나은 도구를 사용할 수있게하는 경우 수행 할 수 있습니다. ( CW고정 너비에 대한 AWK 등) cron 및 sh 스크립트 를 통해 검색 및 변환 자동화가 쉬워 지지만 여전히 Drupal 7 통합을 자동화해야합니다. veew가 관계를 사용하여 데이터를 참조 할 수있는 한 사용자 정의 테이블을 사용할 수도 있습니다.

Drupal 7과 이러한 유형의 데이터 통합을 달성하는 가장 좋은 방법은 무엇입니까? 또한 데이터 또는 달성하려고하는 것에 관한 중요한 세부 정보를 남기지 않습니까?


현재 솔루션을 찾기 위해 찾고있는 몇 가지 프로젝트가 있습니다. 더 큰 데이터 가져 오기로 작업 할 때 다른 경로를 결정할 수 있도록이 기능을 확장하고 싶습니다.

노드로 데이터 가져 오기 :

  • 피드 (D7의 경우 현재 알파)

피드 는 데이터를 안정적으로 가져옵니다. 작은 데이터 소스에는 속도가 적당하지만 300k + 테이블에는 속도가 너무 느립니다.

cron 및 Job Scheduler (현재 Alpha for D7)를 사용하여 자동화 할 수 있습니다 .

소스 데이터에 색인 또는 고유 키가 없으면이를 사용하기가 어렵습니다. 피드보다 빠르지 만 여전히 큰 테이블을 가져 오는 데 느립니다.

자동화는 drush 및 cron을 통해 제공됩니다.

노드 대신 사용자 정의 테이블

데이터 모듈은 매우 유망한 보이지만, 그 순간에 D7 매우 버그가 있습니다. 자동화 및 가져 오기 속도 요구 사항은 데이터를 사용하여 쉽게 충족 할 수 있지만 안정성이 부족합니다. 뷰 통합 (링크 D6입니다) 매우 유망한 보인다.

이것을 참조로 추가했습니다. 이 시점에서 D7 후보는 없지만 사용자 정의 모듈의 시작점으로 사용할 수 있습니다.

이것을 참조로 추가했습니다. 이것은 Drupal 6의 테이블 마법사에 의해 흡수 된 것으로 보입니다. 다시, 참조 용으로 만 추가되었습니다.

통합 을 위해 테이블 마법사 (D6 만 해당) 가 필요한 것 같습니다 . 참조 용으로 추가되었지만 조회 요구 사항을 충족하지 않습니다.


@MPD-가능한 솔루션으로 "Custom Tables"를 추가하고 모듈을 확장했습니다. 이 추가 감사합니다.

답변:


8

내 직감에 따르면이 계획으로 서버가 불에 타게 될 것입니다 ...

진심으로, 만약 당신이 그 많은 양의 데이터를 휘젓고 있다면, 데이터를 외부 데이터 소스에 보관하고 Drupal과 통합해야한다고 생각합니다.

내 초기 생각은 외부 데이터에 두 개의 데이터베이스를 사용하여 방해가되는 일없이 매주 가져 오기를 수행 할 수 있다는 것입니다. 즉, 데이터베이스 A를 시작하여 실행 한 다음 B로 가져옵니다. 가져 오기가 완료되면 B를 라이브 소스로 만듭니다. 그런 다음 닦아서 A로 가져옵니다.

Drupal에 외부 데이터 소스를 많이 통합했으며 실제로 그렇게 어렵지는 않습니다. Drupal에 PHP5 혐오에 대한 전환 계획에 대한 개요를 제공했습니다 . Drupal 6 용이지만 Drupal 7에도 기본적으로 동일한 내용이 적용됩니다. 기본적으로 CCK / Fields API가 자체 인터페이스로 수행하는 작업을 시뮬레이션합니다.

그러나 주간 데이터베이스에 UUID가 없으면 실제로 작업에 렌치가 생깁니다. 하지만이 부분은 Q / A 포럼에서 더 많은 것을 제공 할 수 있어야합니다.

가져 오기 경로를 내려 가고 싶다면 Feeds and Migrate를 사용하여 가져 오기 스크립트를 작성하십시오. 기본적으로 index.php에서 초기 북 스트랩 프로세스를 수행하고 데이터 소스를 쿼리하고 노드를 만든 다음 저장합니다. 프로그래밍 방식으로 노드를 만드는 것은 쉽습니다.

이를 시작하는 가장 좋은 방법은 UI로 노드를 만든 다음 print_r로 가져 와서 가져 오기 스크립트에서 코드로 객체를 복제하는 것입니다. 분류법, 파일 및 노드 참조는 어려운 부분이지만 이러한 객체 속성을 작성하려면 API의이 부분에 익숙해 져야합니다. 유효한 노드 객체가 있으면 node_save ()를 수행하면됩니다. 스크립트가 실행되도록 set_time_limit ()로 매우 큰 한계를 설정하십시오.

설명 / 확장 주소를 수정하려면 아래에서 편집하십시오.

개인적으로 우리는 데이터 가져 오기에 contrib 모듈 기반 접근 방식을 사용하지 않았습니다. 그들은 대부분 잘 작동하지만 우리는 방금 그들과 싸우는 데 너무 많은 시간을 소비하고 비용 / 이익이 너무 낮다고 결정했습니다.

Drupal의 데이터가 실제로 필요한 경우 사용자 정의 가져 오기 스크립트에 대한 나의 의견은 바뀌지 않았습니다. 참조하는 모듈 중 하나를 노드 오브젝트를 빌드하는 방법의 시작점으로 사용하고 데이터 빌드 노드를 반복하여 저장하십시오. PK가있는 경우 데이터베이스 및 node_load ()를 검색하고 수정 및 저장하는 논리를 쉽게 추가 할 수 있습니다. Drupal API를 알고 있다면 가져 오기 스크립트는 실제로 몇 시간 밖에 걸리지 않습니다.

뷰 통합이 핵심이며 편집을 기반으로하는 것처럼 들리며 외부 테이블 접근 방식을 수행하려는 경우 가장 좋은 방법은 사용자 정의 모듈을 수행하고 hook_views_data 를 구현 하여 데이터를 뷰로 가져 오는 것입니다. 어쨌든 데이터 소스를 지원하기 위해 사용자 정의 모듈을 사용할 것이므로이 후크를 추가하는 것이 그렇게 많은 일이되어서는 안됩니다. TW 및 데이터 모듈에는 몇 가지 예가 있어야합니다.

그러나 개인적으로 외부 데이터와의 뷰 통합이 실제로 가치가 있다는 것을 결코 알지 못했습니다. 내가 고려한 경우, 데이터는 뷰 기반 접근 방식으로 잘 작동하기에는 너무 "다른"것이 었습니다. 위의 "abomination"링크에 설명 된 방법을 사용했습니다.


당신은 세 가지 훌륭한 점을 제기했으며, 그에 따라 내 질문을 조정할 것입니다. 대량 가져 오기 및 내보내기는 좋지만이 시점에서 수십만 또는 수백만 개의 노드를 가져올 때는 최상의 비현실적입니다. 사용자 정의 테이블은 뷰와 통합 될 수 있으면 매우 유용 할 수 있습니다. @MPD 응답에 감사드립니다.
Citricguy

2

노드 기반 (또는 엔티티 기반) 접근 방식으로 서버가 수백만 개의 노드로 태워 질 것이라고 생각합니다. 또한 시간별 가져 오기를 살펴보면 적어도 초당 1 번 node_save ()를 만들 것입니다. Drupal에 너무 많은 성능 문제가 발생합니다.

그 이유는 그 내용 때문에 후크 메커니즘이 필요없고 pathauto가 필요하지 않습니다 (그러나 수동으로 별칭을 만들 수 있지만 pathauto보다 훨씬 저렴합니다). 필드가 필요하지 않습니다 ... 간단한 "INSERT"쿼리는 node_save () 또는 entity_save ()보다 100 배 빠릅니다.

1 / IMHO 최상의 옵션은 데이터 가져 오기를위한 사용자 정의 테이블 및 사용자 정의 모듈입니다. 그런 다음 Drupal 통합을위한 뷰 핸들러를 작성하십시오.

2 / 매시간 가져 오는 동안 데이터베이스 캐시가 무효화됩니다. 시간이 너무 많이 걸리면 복제에 대해 생각할 수 있습니다. 가장 쉬운 형태로 두 개의 동일한 테이블을 만들고 첫 번째 테이블을 사용하고 두 번째 테이블로 가져오고 Drupal 구성을 두 번째 테이블을 사용하도록 전환하고 두 번째 테이블을 첫 번째 테이블과 동기화합니다 (선택적으로 첫 번째 테이블로 다시 전환). 또 다른 솔루션은 사용자 정의 가져 오기 스크립트에 있으며 INSERT / UPDATE 쿼리를 준비하고 그룹화 한 다음 한 번의 트랜잭션으로 만 보내 데이터베이스 쓰기 시간을 줄입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.