ฉันกำลังพยายามพัฒนาเว็บแอปบน Google App Engine โดยใช้ webapp2
สิ่งหนึ่งที่ฉันต้องทำคือการดึงข้อมูลแบบสุ่มจาก ndb แล้วแสดงมัน มีวิธีที่มีประสิทธิภาพใดบ้างที่ช่วยให้ฉันทำได้?
ฉันกำลังพยายามพัฒนาเว็บแอปบน Google App Engine โดยใช้ webapp2
สิ่งหนึ่งที่ฉันต้องทำคือการดึงข้อมูลแบบสุ่มจาก ndb แล้วแสดงมัน มีวิธีที่มีประสิทธิภาพใดบ้างที่ช่วยให้ฉันทำได้?
ฉันคิดว่าคุณหมายถึงบันทึกแบบสุ่มเมื่อคุณพูดว่า "สุ่มจาก ndb"
หากคุณใช้รหัสอัตโนมัติคุณสามารถใช้วิธีการต่อไปนี้ (จำนวน ID ของคุณจะเบาบางเพียงใดจะส่งผลต่อความสำเร็จนี้)
ใช้ random.randrange(start, stop)
โดยเริ่มต้นเป็น 0 หยุดเป็น (2^52)-1 ตามนโยบายการจัดสรรรหัสใหม่
ทำการค้นหาคีย์เฉพาะคีย์ที่มากกว่าคีย์ที่สร้างจากรหัสสุ่ม หากไม่มีผลลัพธ์ให้ลองรับคีย์ ‹ สร้างคีย์
ดึงคีย์ 10 (หรือบางหมายเลข)
สุ่มเลือก random.choice(seq)
ตามลำดับของคีย์ที่ส่งคืนจากการดึงข้อมูลครั้งก่อน
key.get() บันทึกที่เลือก
ทางเลือกสำหรับเอนทิตีจำนวนน้อยคือ ‹ 1000
ทำการค้นหาคีย์เท่านั้นและทำให้คีย์ทั้งหมดสมบูรณ์ จากนั้นทำ random.choice()
ในรายการคีย์และ db.get() บนคีย์ที่เลือก วิธีนี้จะเร็วกว่าโซลูชันการวนซ้ำใดๆ มาก หากคุณทำเช่นนี้บ่อยครั้งและชุดของเอนทิตีให้เลือกไม่เปลี่ยนแปลงบ่อยครั้งและรายการคีย์มีขนาดน้อยกว่า 1MB คุณสามารถแคชคีย์ใน memcache ได้
keys = Model.query().fetch(keys_only=True)
2. คว้าคีย์สุ่ม key = random.sample(keys, 1)[0]
3. รับเอนทิตี: return key.get()
แน่นอนว่าสิ่งนี้สามารถขยายได้อย่างง่ายดายเพื่อรองรับเอนทิตีต่างๆ
- person gru; 30.01.2014
มีคุณสมบัติที่สงวนไว้ กระจาย ฉันไม่ค่อยรู้เรื่องนี้มากนัก แต่มีกล่าวถึงในแผนที่/ลดการใช้งาน
__scatter__
ndb ไม่อนุญาตให้ดึงข้อมูลทรัพย์สิน AFAIK จริง ผลลัพธ์ก็จะเหมือนเดิมเสมอไป ไม่มีการสุ่มอยู่ในนั้น
- person yaswanth; 27.08.2019
หากจำนวนเอนทิตีใน Datastore ของคุณไม่มากนัก คุณสามารถใช้วิธีการด้านล่าง: 1 ใช้ yourquery = entitykind.query()
เพื่อดึงข้อมูลเอนทิตีทั้งหมด
2 ใช้ yourquery.count()
เพื่อรับจำนวนเอนทิตี
3 ใช้เครื่องกำเนิดตัวเลขสุ่มเพื่อสร้างตัวเลขสุ่มภายในค่าการนับข้างต้น
4 ใช้ for loop เพื่อวนซ้ำผ่านเอนทิตีที่ส่งคืน
yourquery.fetch()
และเมื่อจำนวนครั้งที่ดำเนินการวนซ้ำเท่ากับจำนวนสุ่มข้างต้น ให้ใช้เอนทิตีเฉพาะใน webapp ของคุณ