Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Diffuser les résultats des requêtes avec Gremlin
Lorsque vous exécutez une traversée Gremlin qui renvoie un grand nombre de résultats, Neptune les renvoie au client par lots via la connexion. WebSocket Neptune envoie les lots de résultats au fur et à mesure de leur production, sans attendre que le client en demande davantage. Cela peut être avantageux si vous souhaitez traiter les résultats tels qu'ils sont renvoyés par le serveur, mais cela nécessite d'utiliser des modèles d'itération paresseux pour éviter de collecter l'ensemble de résultats complet en mémoire.
Neptune envoie les résultats par lots de 64 par WebSocket image par défaut. Vous ne pouvez pas modifier cette valeur par défaut côté serveur, mais la taille du lot peut être modifiée par demande par le client à l'aide de l'option de batchSizeTokens.ARGS_BATCH_SIZE dans le pilote Java ou connectionPool.resultIterationBatchSize par défaut au niveau du pilote).
Pour plus de détails sur la configuration batchSize dans d'autres pilotes de langue, consultez la section Configuration de chaque pilote dans la documentation des pilotes et variantes d'
Comme le serveur transmet automatiquement les résultats, la contre-pression côté client est gérée implicitement via le protocole TCP et le contrôle de flux. WebSocket Si le client met du temps à lire depuis le socket, les écritures du serveur finiront par être bloquées jusqu'à ce que le client rattrape son retard.
Important
Le streaming est plus efficace avec les traversées qui peuvent produire des résultats de manière incrémentielle. Les traversées qui incluentorder(),, groupCount() group()dedup(), ou d'autres étapes nécessitant la fin de la traversée complète avant d'émettre des résultats obligeront Neptune à matérialiser l'ensemble de résultats complet en mémoire avant le début de la diffusion. Dans ces cas, le traitement par lots réduit tout de même la charge de sérialisation par image, mais ne réduit pas l'utilisation de la mémoire côté serveur.
Consommer les résultats de manière incrémentielle
Pour traiter les résultats au fur et à mesure qu'ils arrivent, itérez paresseusement en utilisanthasNext()/next()ou des API équivalentes plutôt que de rassembler tous les résultats dans une liste. Vous pouvez l'utiliser next(batchSize) pour extraire les résultats par lots au niveau de l'application, ce qui vous permet d'effectuer un travail intermédiaire entre les lots pendant que le serveur continue à produire des résultats.
Exemple 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"); }
Exemple 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")
Exemple 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) }
Exemple.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"); }
Exemple 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`); }
Consommation anticipée ou consommation incrémentielle
Le streaming vous permet de traiter les résultats de manière incrémentielle au fur et à mesure que des données supplémentaires sont récupérées et renvoyées. Les méthodes suivantes se bloquent jusqu'à ce que l'ensemble des résultats soit collecté en mémoire, empêchant ainsi votre application d'agir sur les résultats au fur et à mesure qu'ils arrivent :
Java :
toList()outoSet()Python :
toList()outoSet()Allez :
ToList(),ToSet(), ouGetResultSet().GetAll().NET :
ToList()ouPromise()Node.js:
toList()
Note
Les données continuent de circuler de manière incrémentielle sur la WebSocket connexion, même en utilisant ces méthodes. La différence est que votre application ne peut pas traiter les résultats individuels tant que la collection n'est pas complète. Pour traiter les résultats au fur et à mesure qu'ils arrivent, utilisez l'itération différée ou les modèles de lots présentés dans les exemples ci-dessus.