Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Hasil kueri streaming dengan Gremlin
Saat Anda menjalankan traversal Gremlin yang mengembalikan sejumlah besar hasil, Neptunus mengalirkannya kembali ke klien dalam batch melalui koneksi. WebSocket Neptunus mengirimkan batch hasil saat diproduksi, tanpa menunggu klien meminta lebih banyak. Ini bisa menguntungkan jika Anda ingin memproses hasil saat dikembalikan dari server, tetapi memerlukan penggunaan pola iterasi malas untuk menghindari pengumpulan hasil lengkap yang disetel ke dalam memori.
Neptunus mengirimkan hasil dalam batch 64 WebSocket per frame secara default. Anda tidak dapat mengubah default sisi server ini, tetapi ukuran batch dapat diganti berdasarkan per-permintaan dari klien menggunakan opsi batchSizeTokens.ARGS_BATCH_SIZE di driver Java, atau sebagai default tingkat driver). connectionPool.resultIterationBatchSize
Untuk detail tentang mengonfigurasi driver batchSize bahasa lain, lihat bagian Konfigurasi untuk setiap driver di dokumentasi Apache TinkerPop Gremlin Drivers
Karena server mendorong hasil secara otomatis, tekanan balik sisi klien ditangani secara implisit melalui TCP dan kontrol aliran. WebSocket Jika klien lambat membaca dari soket, penulisan server pada akhirnya akan diblokir sampai klien menyusul.
penting
Streaming paling efektif dengan traversal yang dapat menghasilkan hasil secara bertahap. Traversal yang mencakuporder(),,groupCount(), group()dedup(), atau langkah-langkah lain yang memerlukan traversal penuh untuk diselesaikan sebelum memancarkan hasil akan menyebabkan Neptunus mewujudkan seluruh hasil yang ditetapkan dalam memori sebelum streaming dimulai. Dalam kasus ini, batching masih mengurangi overhead serialisasi per frame, tetapi tidak mengurangi penggunaan memori sisi server.
Mengkonsumsi hasil secara bertahap
Untuk memproses hasil saat mereka tiba, ulangi dengan malas menggunakanhasNext()/next()atau setara APIs daripada mengumpulkan semua hasil ke dalam daftar. Anda dapat menggunakan next(batchSize) untuk menarik hasil dalam batch tingkat aplikasi, memungkinkan Anda untuk melakukan pekerjaan menengah antar batch sementara server terus menghasilkan hasil.
contoh Java (bytecode GLV)
GraphTraversalSource g = traversal().withRemote(connection); int batchSize = 10; int batchNum = 0; var traversal = g.V().hasLabel("movie").values("title").limit(1000); while (traversal.hasNext()) { var batch = traversal.next(batchSize); batchNum++; for (var title : batch) { System.out.println(" " + title); } // Do other intermediary work here between batch calls System.out.println("Batch " + batchNum + " processing complete\n"); }
contoh Python
g = traversal().with_remote(connection) BATCH_SIZE = 10 batch_num = 0 t = g.V().has_label('movie').values('title').limit(1000) while t.has_next(): batch = t.next(BATCH_SIZE) batch_num += 1 for title in batch: print(f" {title}") # Do other intermediary work here between batch calls print(f"Batch {batch_num} processing complete\n")
contoh Go
// The Go driver does not support next(n), so batches are accumulated manually. g := gremlingo.Traversal_().WithRemote(connection) resultSet, err := g.V().HasLabel("movie").Values("title").Limit(1000).GetResultSet() if err != nil { log.Fatal(err) } batchSize := 10 batchNum := 0 for { var batch []interface{} for i := 0; i < batchSize; i++ { result, ok, err := resultSet.One() // returns (value, ok, error); ok is false when results are exhausted if err != nil { log.Fatal(err) } if !ok { break } batch = append(batch, result) } if len(batch) == 0 { break } batchNum++ for _, v := range batch { fmt.Printf(" %v\n", v) } // Do other intermediary work here between batch calls fmt.Printf("Batch %d processing complete\n\n", batchNum) }
contoh.NET
var g = Traversal().WithRemote(connection); var batchSize = 10; var batchNum = 0; var traversal = g.V().HasLabel("movie").Values<string>("title").Limit<string>(1000); while (traversal.HasNext()) { var batch = traversal.Next(batchSize); batchNum++; foreach (var title in batch) { Console.WriteLine($" {title}"); } // Do other intermediary work here between batch calls Console.WriteLine($"Batch {batchNum} processing complete\n"); }
contoh Node.js
// The Node.js driver does not support next(n), so batches are accumulated manually. const g = traversal().withRemote(connection); const batchSize = 10; let batchNum = 0; const t = g.V().hasLabel('movie').values('title').limit(1000); while (true) { const batch = []; for (let i = 0; i < batchSize; i++) { const result = await t.next(); if (result.done) break; batch.push(result.value); } if (batch.length === 0) break; batchNum++; for (const title of batch) { console.log(` ${title}`); } // Do other intermediary work here between batch calls console.log(`Batch ${batchNum} processing complete\n`); }
Konsumsi bersemangat vs. tambahan
Streaming memungkinkan Anda memproses hasil secara bertahap karena data tambahan diambil dan dikembalikan. Metode berikut memblokir hingga seluruh kumpulan hasil dikumpulkan ke dalam memori, mencegah aplikasi Anda bertindak berdasarkan hasil saat tiba:
Java:
toList()atautoSet()Python: atau
toList()toSet()Pergi:
ToList(),ToSet(), atauGetResultSet().GetAll().NET:
ToList()atauPromise()Node.js:
toList()
catatan
Data masih mengalir secara bertahap melalui WebSocket koneksi bahkan saat menggunakan metode ini. Perbedaannya adalah bahwa aplikasi Anda tidak dapat memproses hasil individu sampai seluruh koleksi selesai. Untuk memproses hasil saat mereka tiba, gunakan iterasi malas atau pola batch yang ditunjukkan pada contoh di atas.