การอิมพอร์ตแหล่งข้อมูลไฟล์แฟล็ตขนาดใหญ่ด้วยการรวม Drupal 7 กับ Views 3


13

เป้าหมายของฉันคือการผลิตที่รวดเร็วเชื่อถือได้และวิธีการแบบอัตโนมัติสำหรับการเข้าถึงแบบอ่านอย่างเดียวข้อมูลที่มีอยู่ในหลายขนาดใหญ่มากแหล่งข้อมูลแบนไฟล์ ( CSV s คงความกว้างและเอกสาร XML) โดยใช้ Drupal 7 ที่สามารถสอบถามกับใช้เข้าชม 3โมดูล. ฉันต้องการใช้โมดูลที่มีอยู่แล้ว แต่การสร้างโมดูลที่กำหนดเองก็เป็นตัวเลือกเช่นกัน

เพื่อช่วยแยกแยะโมดูลและวิธีการที่ไม่เหมาะกับงานนี่คือสถิติของไฟล์ที่ฉันใช้งาน:

  • ประจำปีนำเข้า: 8,500,000 เส้นCSVไฟล์ (ล้างและโหลดใหม่ทุกปีมีคีย์หลัก)
  • นำเข้ารายสัปดาห์: ไฟล์ความกว้างคงที่ 350,000 บรรทัด (ล้างและโหลดใหม่ทุกสัปดาห์ไม่มีคีย์หลัก )
  • นำเข้ารายชั่วโมง: 3,400 บรรทัดCSVไฟล์ (ต้องการอัปเดตและซิงค์บ่อยที่สุดเท่าที่จะทำได้ แต่ไม่เกินทุก ๆ 20 นาทีมีคีย์หลัก)
  • นำเข้ารายวัน: ไฟล์ XML 200 รายการ (ล้างและรีโหลดทุกวันมีคีย์หลัก)

การแปลงระหว่างสามรูปแบบไม่ใช่ปัญหาและสามารถทำได้หากจะปรับปรุงประสิทธิภาพการนำเข้าหรืออนุญาตให้ใช้เครื่องมือที่ดีกว่า ( AWKสำหรับความกว้างคงที่เป็น CSVและอื่น ๆ ) การดึงและการแปลงอัตโนมัติทำได้ง่ายผ่าน cron และshสคริปต์ แต่ยังคงต้องทำการรวมระบบ Drupal 7 โดยอัตโนมัติ การใช้ตารางที่กำหนดเองนั้นสามารถทำได้ตราบเท่าที่ vews สามารถอ้างอิงข้อมูลโดยใช้ความสัมพันธ์

อะไรคือวิธีปฏิบัติที่ดีที่สุดในการรวมข้อมูลประเภทนี้กับ Drupal 7 นอกจากนี้ฉันยังไม่ทิ้งรายละเอียดที่สำคัญเกี่ยวกับข้อมูลหรือสิ่งที่ฉันพยายามทำให้สำเร็จ


ต่อไปนี้เป็นโครงการบางอย่างที่ฉันกำลังมองหาเพื่อหาทางแก้ไข ฉันต้องการขยายตัวเพื่อช่วยผู้อื่นในการตัดสินใจว่าจะใช้เส้นทางใดเมื่อทำงานกับการนำเข้าข้อมูลที่ใหญ่ขึ้น

การนำเข้าข้อมูลไปยังโหนด:

  • ฟีด (ปัจจุบันคืออัลฟ่าสำหรับ D7)

ฟีดจะนำเข้าข้อมูลได้อย่างน่าเชื่อถือ ความเร็วเหมาะสมสำหรับแหล่งข้อมูลขนาดเล็ก แต่ช้าเกินไปสำหรับ 300k + ตาราง

การทำงานอัตโนมัติพร้อมใช้งานโดยใช้ cron และJob Scheduler (ปัจจุบันคืออัลฟ่าสำหรับ D7)

การไม่มีดัชนีหรือคีย์เฉพาะในแหล่งข้อมูลทำให้ยากต่อการใช้งาน มันเร็วกว่าฟีด แต่ก็ยังช้าที่จะนำเข้าตารางที่มีขนาดใหญ่มาก

ระบบอัตโนมัติใช้ได้ผ่าน drush และ cron

ตารางที่กำหนดเองแทนโหนด

โมดูลข้อมูลลักษณะสัญญาว่า แต่เป็นรถมากสำหรับ D7 ในขณะนี้ ความต้องการอัตโนมัติและความเร็วนำเข้านั้นสามารถทำได้ง่ายโดยใช้ข้อมูล แต่ขาดความน่าเชื่อถือ การรวมการดู (ลิงก์สำหรับ D6) ดูมีแนวโน้มมาก

เพิ่มสิ่งนี้สำหรับการอ้างอิง ไม่มีผู้สมัคร D7 ในตอนนี้ แต่สามารถทำหน้าที่เป็นจุดเริ่มต้นสำหรับโมดูลที่กำหนดเอง

เพิ่มสิ่งนี้สำหรับการอ้างอิง ดูเหมือนว่าตารางดังกล่าวจะถูกดูดซับโดย Table Wizard ใน Drupal 6 อีกครั้งเพิ่มเพื่อการอ้างอิงเท่านั้น

ดูเหมือนว่าต้องการตัวช่วยสร้างตาราง (D6 เท่านั้น) สำหรับการรวมViews เพิ่มเพื่อการอ้างอิง แต่ไม่เป็นไปตามข้อกำหนดของ Views


@MPD - เพิ่ม "Custom Tables" เป็นวิธีแก้ปัญหาที่เป็นไปได้และขยายโมดูล ขอบคุณสำหรับการเพิ่มนี้

คำตอบ:


8

ลำไส้ของฉันบอกฉันว่าแผนนี้จะทำให้เซิร์ฟเวอร์ของคุณติดไฟ ...

อย่างจริงจังหากคุณกำลังปั่นข้อมูลจำนวนมากฉันคิดว่าคุณต้องเก็บข้อมูลไว้ในแหล่งข้อมูลภายนอกแล้วรวมเข้ากับ Drupal

ความคิดเริ่มต้นของฉันคือการใช้ฐานข้อมูลสองแห่งสำหรับข้อมูลภายนอกเพื่อให้คุณสามารถนำเข้ารายสัปดาห์โดยไม่มีสิ่งรบกวนมากเกินไป กล่าวอีกนัยหนึ่งรับฐานข้อมูล A และเรียกใช้แล้วนำเข้าสู่ B เมื่อการนำเข้าเสร็จแล้วให้ B เป็นแหล่งข้อมูลสด จากนั้นเช็ดและนำเข้าสู่ A

ฉันได้ทำการรวมแหล่งข้อมูลภายนอกเข้ากับ Drupal แล้วและมันก็ไม่ได้ยาก ฉันให้ภาพรวมในการวางแผนการเปลี่ยนแปลงสำหรับ PHP5 น่าสะอิดสะเอียนต่อ Drupal นั่นคือสำหรับ Drupal 6 แต่โดยทั่วไปแล้วสิ่งเดียวกันนี้ใช้กับ Drupal 7 โดยพื้นฐานแล้วคุณจำลองสิ่งที่ CCK / Fields API ทำกับอินเตอร์เฟสของคุณเอง

แต่การไม่มี UUID สำหรับฐานข้อมูลรายสัปดาห์จะทำให้เกิดปัญหาในการทำงาน ส่วนนั้นต้องการมาก แต่มากกว่านั้นสามารถจัดให้ในฟอรัม Q / A เช่นนี้

หากคุณต้องการลงเส้นทางการนำเข้าจริงๆฉันจะประกันตัวในฟีดและย้ายข้อมูลและเขียนสคริปต์นำเข้าของคุณเอง โดยทั่วไปคุณทำขั้นตอนการทำบุ๊คมาร์คเริ่มต้นจาก index.php, ค้นหาแหล่งข้อมูลของคุณสร้างโหนดของคุณแล้วบันทึก โดยทางโปรแกรมทำให้เป็นเรื่องง่าย

วิธีที่ดีที่สุดในการเริ่มต้นด้วยสิ่งนี้คือการสร้างโหนดด้วย UI จากนั้นพิมพ์มันและทำซ้ำวัตถุด้วยรหัสในสคริปต์นำเข้าของคุณ Taxonomy, ไฟล์, และ noderefs, เป็นส่วนที่ยาก, แต่คุณต้องทำความคุ้นเคยกับส่วนต่างๆของ API เหล่านี้เพื่อสร้างคุณสมบัติของวัตถุเหล่านี้ เมื่อคุณมีวัตถุโหนดที่ถูกต้องแล้วคุณก็สามารถทำ node_save () ตรวจสอบให้แน่ใจว่าคุณตั้งค่าขีด จำกัด ขนาดใหญ่มากด้วย set_time_limit () เพื่อให้สคริปต์ทำงาน

แก้ไขด้านล่างเพื่อการจำแนกที่อยู่ / การขยาย:

โดยส่วนตัวเราหยุดใช้วิธีการตามโมดูล contrib สำหรับการนำเข้าข้อมูลเมื่อไม่นานมานี้ ส่วนใหญ่ทำงานได้ดี แต่เราเพิ่งเสียเวลาไปกับการต่อสู้กับพวกเขามากเกินไปและตัดสินใจว่าค่าใช้จ่าย / ผลประโยชน์ต่ำเกินไป

หากคุณต้องการข้อมูลใน Drupal อย่างเหมาะสมความคิดเห็นของฉันเกี่ยวกับสคริปต์การนำเข้าที่กำหนดเองจะไม่เปลี่ยนแปลง หนึ่งในโมดูลที่คุณอ้างอิงสามารถใช้เป็นจุดเริ่มต้นสำหรับวิธีการสร้างวัตถุโหนดจากนั้นก็วนลูปผ่านโหนดสร้างข้อมูลของคุณและบันทึกไว้ หากคุณมี PK คุณสามารถเพิ่มตรรกะเพื่อค้นหาฐานข้อมูลและ node_load () แก้ไขและบันทึกได้ สคริปต์นำเข้าใช้งานได้จริงเพียงไม่กี่ชั่วโมงถ้าคุณรู้จัก Drupal API

หากการรวมมุมมองเป็นกุญแจสำคัญ (และฟังดูเหมือนว่ามันเป็นไปตามการแก้ไข) และคุณต้องการทำวิธีการตารางภายนอกตัวเลือกที่ดีที่สุดของคุณคือทำโมดูลที่กำหนดเองและใช้hook_views_dataเพื่อให้ข้อมูลของคุณเข้าสู่มุมมอง ยิ่งกว่านั้นคุณจะกำหนดโมดูลเองเพื่อสนับสนุนแหล่งข้อมูลของคุณดังนั้นการเพิ่มตะขอนี้ไม่ควรจะทำงานได้มากขึ้น โมดูล TW และ Data ควรมีตัวอย่างเพื่อให้คุณไป

แม้ว่าโดยส่วนตัวแล้วฉันไม่เคยพบว่าการผสานรวมมุมมองกับข้อมูลภายนอกเป็นสิ่งที่คุ้มค่าจริงๆ ในกรณีที่ฉันได้พิจารณาแล้วข้อมูลก็ "แตกต่าง" เกินไปที่จะทำงานได้ดีกับวิธีการตามมุมมอง ฉันแค่ใช้วิธีที่ฉันอธิบายไว้ในลิงก์ "สิ่งที่น่ารังเกียจ" ด้านบน


คุณได้คะแนนสามคะแนนที่ยอดเยี่ยมและฉันจะปรับคำถามของฉันตามนั้น การนำเข้าและส่งออกจำนวนมากจะดี แต่เมื่อนำเข้าหลายร้อยหลายพันหรืออาจเป็นล้านโหนด ณ จุดนี้ดูเหมือนว่าดีที่สุดไม่สมจริง ตารางที่กำหนดเองอาจใช้งานได้มากหากสามารถรวมกับมุมมอง ขอบคุณสำหรับการตอบกลับของคุณ @MPD
Citricguy

2

ฉันคิดว่าวิธีการตามโหนด (หรือตามนิติบุคคล) จะเผาไหม้เซิร์ฟเวอร์ของคุณด้วยล้านโหนด นอกจากนี้เมื่อดูการนำเข้ารายชั่วโมงของคุณนั่นหมายความว่าคุณจะสร้าง node_save () อย่างน้อยหนึ่งครั้งต่อวินาที นั่นมากเกินไปสำหรับ Drupal และทำให้เกิดปัญหาประสิทธิภาพ

เหตุผลที่อยู่เบื้องหลังนั้นสำหรับเนื้อหาเหล่านั้นคุณไม่จำเป็นต้องใช้กลไกของ hook คุณไม่จำเป็นต้องมี pathauto (แต่คุณสามารถสร้างนามแฝงด้วยตนเองมันถูกกว่า pathauto มาก) คุณไม่จำเป็นต้องใช้เขตข้อมูล ... เขียน การสืบค้น "INSERT" แบบง่ายคือ 100x เร็วกว่า node_save () หรือ entity_save ()

1 / IMHO ตัวเลือกที่ดีที่สุดคือตารางที่กำหนดเองและโมดูลที่กำหนดเองสำหรับการนำเข้าข้อมูลของคุณจากนั้นเขียนตัวจัดการ Views สำหรับการรวม Drupal

2 / แคชฐานข้อมูลไม่ถูกต้องในระหว่างการนำเข้ารายชั่วโมง ถ้าใช้เวลามากเกินไปคุณสามารถคิดถึงการจำลองแบบได้ ในฟอร์มที่ง่ายที่สุดให้สร้างตารางที่เหมือนกันสองตารางใช้ตารางแรกนำเข้าตารางที่สองสลับการกำหนดค่า Drupal ของคุณเพื่อใช้ตารางที่สองซิงค์ตารางที่ 2 เป็นอันดับที่ 1 (เลือกที่จะสลับกลับไปเป็นตารางแรก) โซลูชันอื่นอยู่ในสคริปต์นำเข้าที่กำหนดเองของคุณเตรียมและจัดกลุ่มแบบสอบถาม INSERT / UPDATE จากนั้นส่งเฉพาะตอนท้ายในหนึ่งธุรกรรมเพื่อลดเวลาในการเขียนฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.