ค้นหาแถวสุ่มใน ndb [ปิด]

ฉันกำลังพยายามพัฒนาเว็บแอปบน Google App Engine โดยใช้ webapp2

สิ่งหนึ่งที่ฉันต้องทำคือการดึงข้อมูลแบบสุ่มจาก ndb แล้วแสดงมัน มีวิธีที่มีประสิทธิภาพใดบ้างที่ช่วยให้ฉันทำได้?


person Jun Hao    schedule 25.06.2013    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ การดึงบันทึกแบบสุ่มจาก Google App Engine พื้นที่เก็บข้อมูล?   -  person Sebastian Kreft    schedule 25.06.2013


คำตอบ (3)


ฉันคิดว่าคุณหมายถึงบันทึกแบบสุ่มเมื่อคุณพูดว่า "สุ่มจาก ndb"

หากคุณใช้รหัสอัตโนมัติคุณสามารถใช้วิธีการต่อไปนี้ (จำนวน ID ของคุณจะเบาบางเพียงใดจะส่งผลต่อความสำเร็จนี้)

ใช้ random.randrange(start, stop) โดยเริ่มต้นเป็น 0 หยุดเป็น (2^52)-1 ตามนโยบายการจัดสรรรหัสใหม่

ทำการค้นหาคีย์เฉพาะคีย์ที่มากกว่าคีย์ที่สร้างจากรหัสสุ่ม หากไม่มีผลลัพธ์ให้ลองรับคีย์ ‹ สร้างคีย์

ดึงคีย์ 10 (หรือบางหมายเลข)

สุ่มเลือก random.choice(seq) ตามลำดับของคีย์ที่ส่งคืนจากการดึงข้อมูลครั้งก่อน

key.get() บันทึกที่เลือก

ทางเลือกสำหรับเอนทิตีจำนวนน้อยคือ ‹ 1000

ทำการค้นหาคีย์เท่านั้นและทำให้คีย์ทั้งหมดสมบูรณ์ จากนั้นทำ random.choice() ในรายการคีย์และ db.get() บนคีย์ที่เลือก วิธีนี้จะเร็วกว่าโซลูชันการวนซ้ำใดๆ มาก หากคุณทำเช่นนี้บ่อยครั้งและชุดของเอนทิตีให้เลือกไม่เปลี่ยนแปลงบ่อยครั้งและรายการคีย์มีขนาดน้อยกว่า 1MB คุณสามารถแคชคีย์ใน memcache ได้

person Tim Hoffman    schedule 25.06.2013
comment
เฮ้ ตามคำแนะนำของคำตอบนี้ ฉันใช้เวอร์ชันที่เรียบง่ายสุด ๆ เนื่องจากการดึงข้อมูลด้วย randrange และคิวรีสำหรับคีย์ ‹ หรือ › ไม่ได้ผลสำหรับฉัน (ทั้งค่าว่างหรือค่าเดียวกัน) นี่เป็นตัวอย่างข้อมูล: 1. ดึงคีย์ทั้งหมด keys = Model.query().fetch(keys_only=True) 2. คว้าคีย์สุ่ม key = random.sample(keys, 1)[0] 3. รับเอนทิตี: return key.get() แน่นอนว่าสิ่งนี้สามารถขยายได้อย่างง่ายดายเพื่อรองรับเอนทิตีต่างๆ - person gru; 30.01.2014
comment
วิธีการเฉพาะจะขึ้นอยู่กับจำนวนและความกระจัดกระจายของรหัสที่จัดสรรได้ดีเพียงใด ข้อเท็จจริงที่คุณสามารถดึงข้อมูลคีย์ทั้งหมดในแบบสอบถามเดียวนั้นอยู่ในตัวระบุเอนทิตีจำนวนเล็กน้อยของฉัน อีกวิธีหนึ่งคือการใช้คีย์นับล้านและมากกว่านั้น - person Tim Hoffman; 30.01.2014

มีคุณสมบัติที่สงวนไว้ กระจาย ฉันไม่ค่อยรู้เรื่องนี้มากนัก แต่มีกล่าวถึงในแผนที่/ลดการใช้งาน

person Guido van Rossum    schedule 25.06.2013
comment
ฉันไม่แน่ใจเหมือนกันว่าทรัพย์สินที่สงวนไว้แบบกระจายคืออะไร - person Jun Hao; 27.06.2013
comment
คุณได้ลองใช้ Google แล้วหรือยัง? - person Guido van Rossum; 04.07.2013
comment
เป็นไปได้เท่านั้นที่จะได้รับบันทึกจาก ndb เรียงลำดับตามคุณสมบัติ __scatter__ ndb ไม่อนุญาตให้ดึงข้อมูลทรัพย์สิน AFAIK จริง ผลลัพธ์ก็จะเหมือนเดิมเสมอไป ไม่มีการสุ่มอยู่ในนั้น - person yaswanth; 27.08.2019

หากจำนวนเอนทิตีใน Datastore ของคุณไม่มากนัก คุณสามารถใช้วิธีการด้านล่าง: 1 ใช้ yourquery = entitykind.query() เพื่อดึงข้อมูลเอนทิตีทั้งหมด

2 ใช้ yourquery.count() เพื่อรับจำนวนเอนทิตี

3 ใช้เครื่องกำเนิดตัวเลขสุ่มเพื่อสร้างตัวเลขสุ่มภายในค่าการนับข้างต้น

4 ใช้ for loop เพื่อวนซ้ำผ่านเอนทิตีที่ส่งคืน

yourquery.fetch()

และเมื่อจำนวนครั้งที่ดำเนินการวนซ้ำเท่ากับจำนวนสุ่มข้างต้น ให้ใช้เอนทิตีเฉพาะใน webapp ของคุณ

person tony m    schedule 25.06.2013
comment
วิธีนี้ใช้ได้ผลดีกับชุดข้อมูลขนาดเล็ก หากคุณมีเอนทิตีจำนวนมาก สิ่งนี้จะไม่ปรับขนาด - person Tim Hoffman; 25.06.2013
comment
แม้แต่ชุดเล็กๆ ก็มีวิธีที่ดีกว่า โดยใช้ offset=‹random›, Limit=1 - person Guido van Rossum; 25.06.2013