Я использую сервер gremlin, у меня большой набор данных, и я выполняю разбиение по страницам gremlin. Ниже приведен образец запроса:
query = """g.V().both().both().count()"""
data = execute_query(query)
for x in range(0,int(data[0]/10000)+1):
print(x*10000, " - ",(x+1)*10000)
query = """g.V().both().both().range({0}*10000, {1}*10000)""".format(x,x+1)
data = execute_query(query)
def execute_query(query):
"""query execution"""
Вышеупомянутый запрос работает нормально, для разбивки на страницы я должен знать, где остановить выполнение запроса. для получения диапазона мне нужно сначала получить счетчик запроса и перейти к циклу for. Есть ли другой способ разбивки на страницы гремлина.
- Разбивка на страницы требуется, потому что она не работает при выборке 100 КБ данных в одном примере. g.V().both().both().count()
если мы не используем разбиение на страницы, это дает мне следующую ошибку:
ERROR:tornado.application:Uncaught exception, closing connection.
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/tornado/iostream.py", line 554, in wrapper
return callback(*args)
File "/usr/local/lib/python3.5/dist-packages/tornado/stack_context.py", line 343, in wrapped
raise_exc_info(exc)
File "<string>", line 3, in raise_exc_info
File "/usr/local/lib/python3.5/dist-packages/tornado/stack_context.py", line 314, in wrapped
ret = fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/tornado/websocket.py", line 807, in _on_frame_data
self._receive_frame()
File "/usr/local/lib/python3.5/dist-packages/tornado/websocket.py", line 697, in _receive_frame
self.stream.read_bytes(2, self._on_frame_start)
File "/usr/local/lib/python3.5/dist-packages/tornado/iostream.py", line 312, in read_bytes
assert isinstance(num_bytes, numbers.Integral)
File "/usr/lib/python3.5/abc.py", line 182, in __instancecheck__
if subclass in cls._abc_cache:
File "/usr/lib/python3.5/_weakrefset.py", line 75, in __contains__
return wr in self.data
RecursionError: maximum recursion depth exceeded in comparison
ERROR:tornado.application:Exception in callback functools.partial(<function wrap.<locals>.null_wrapper at 0x7f3e1c409ae8>)
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/tornado/ioloop.py", line 604, in _run_callback
ret = callback()
File "/usr/local/lib/python3.5/dist-packages/tornado/stack_context.py", line 275, in null_wrapper
return fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/tornado/iostream.py", line 554, in wrapper
return callback(*args)
File "/usr/local/lib/python3.5/dist-packages/tornado/stack_context.py", line 343, in wrapped
raise_exc_info(exc)
File "<string>", line 3, in raise_exc_info
File "/usr/local/lib/python3.5/dist-packages/tornado/stack_context.py", line 314, in wrapped
ret = fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/tornado/websocket.py", line 807, in _on_frame_data
self._receive_frame()
File "/usr/local/lib/python3.5/dist-packages/tornado/websocket.py", line 697, in _receive_frame
self.stream.read_bytes(2, self._on_frame_start)
File "/usr/local/lib/python3.5/dist-packages/tornado/iostream.py", line 312, in read_bytes
assert isinstance(num_bytes, numbers.Integral)
File "/usr/lib/python3.5/abc.py", line 182, in __instancecheck__
if subclass in cls._abc_cache:
File "/usr/lib/python3.5/_weakrefset.py", line 75, in __contains__
return wr in self.data
RecursionError: maximum recursion depth exceeded in comparison
Traceback (most recent call last):
File "/home/rgupta/Documents/BitBucket/ecodrone/ecodrone/test2.py", line 59, in <module>
data = execute_query(query)
File "/home/rgupta/Documents/BitBucket/ecodrone/ecodrone/test2.py", line 53, in execute_query
results = future_results.result()
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 405, in result
return self.__get_result()
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 357, in __get_result
raise self._exception
File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/resultset.py", line 81, in cb
f.result()
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 398, in result
return self.__get_result()
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 357, in __get_result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/connection.py", line 77, in _receive
self._protocol.data_received(data, self._results)
File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/protocol.py", line 100, in data_received
self.data_received(data, results_dict)
File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/protocol.py", line 100, in data_received
self.data_received(data, results_dict)
File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/protocol.py", line 100, in data_received
self.data_received(data, results_dict)
File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/protocol.py", line 100, in data_received
эта линия повторяется 100 раз File "/usr/local/lib/python3.5/dist-packages/gremlin_python/driver/protocol.py", line 100, in data_received
На этот вопрос в основном дан ответ здесь, но я добавлю еще несколько комментариев.
Ваш подход к разбиению на страницы действительно дорог, так как я не знаю каких-либо графиков, которые оптимизируют этот конкретный обход, и вы в основном повторяете все эти данные много раз. Вы делаете это один раз для count()
, затем повторяете первые 10000, затем для вторых 10000, вы повторяете первые 10000, затем вторые 10000, а затем на третьем 10000, вы повторяете первые 20000, затем третьи 10000 и скоро...
Я не уверен, есть ли что-то большее в вашей логике, но то, что у вас есть, похоже на форму «группировки» для получения меньших групп результатов. В этом нет особой необходимости, поскольку Gremlin Server уже делает это за вас внутри компании. Если вы просто отправите g.V().both().both()
, Gremlin Server будет объединять результаты, учитывая параметр конфигурации resultIterationBatchSize
.
В любом случае, на самом деле нет лучшего способа заставить работать подкачку, о котором я знаю, помимо того, что было объяснено в другом вопросе, который я упомянул.
Вы говорите, что «печать партий» важна? кроме того, он не должен вылетать ... что за сообщение об ошибке?
обновил мой пост, добавил сообщение об ошибке и он отлично работает с разбивкой на страницы
Я предполагаю, что это какая-то ошибка в клиенте python. об этом сообщалось ранее, но не подтверждено - я создал проблему - issues.apache.org/jira/browse/TINKERPOP-2021
client = driver.Client (GREMLIN_URL, GREMLIN_VAR) result_set = client.submit (query), когда я печатаю result_set в цикле
for
, я получаю [row, row, ...] так что вместоfuture_results = result_set.all()
есть способ получить данные партиями?result_set.all()
аварийно завершает работу, если возвращается около 100 000 записей.