Проблема производительности при разборе JSON и хранении данных в базе данных - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать веб-приложение, которое преобразует эскизы в слайды.Расположение и категория объектов на слайде будет определяться с помощью JSON, как показано ниже:

[
  {
    "attachment": "https://s3-us-west-2.amazonaws.com/some_picture.jpg",
    "response": {
      "annotations": [
        {
          "width": 72,
          "height": 20,
          "left": 24,
          "top": 180,
          "label": "text"
        },
        {
          "width": 96,
          "height": 19,
          "left": 26,
          "top": 212,
          "label": "picture"
        }
      ]
    }
  }
]

Я использовал каждый цикл, чтобы пройти через объекты в файле JSON и затем сохранить их в базе данных Neo4j.

def save_detection_to_db(detection_json)
  detection_json.each do |single_picture|
    annotations = single_picture["response"]["annotations"]
    annotations.each do |single_annotation|
      label = single_annotation["label"]
      determine_node_label(label).create(width: single_annotation["width"], 
                                         height: single_annotation["height"],
                                         top: single_annotation["top"],
                                         left: single_annotation["left"],
                                         category: single_annotation["label"])
    end
  end
end

# determine_node_label("text") #=> Text
# determine_node_label("picture") #=> Picture

Таким образом, я могу хранить около 100 объектов за 0,6 с.Но, учитывая, что это приложение предназначено для использования многими людьми для создания слайдов, оно не справится с этой задачей.Я предполагаю, что каждый цикл не является хорошим способом сделать это.Какие еще методы я должен попробовать?Любое предложение будет оценено.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вы можете попробовать:

def save_detection_to_db(detection_json)
  detection_json.each do |single_picture|
    annotations = single_picture["response"]["annotations"].group_by{|x| x["label"]}
    annotations.each do |k, values|
      klass = determine_node_label(k)
      values.each do |value|
         value["category"] = value.delete("label")
         klass.create(value)
      end 
    end
end

В приведенном выше коде мы не находим узел для каждой записи, group_by сгруппирует узлы и найдет только их, это уменьшит количество циклов итакже каждый val.

У меня нет никаких знаний о neo4jr, если у вас есть пакетные вставки в neo4j, просто возьмите значения и вставьте оттуда.

value["category"] = value.delete("label")

означает:

В цикле у нас будет значение:

{"width"=>72, "height"=>20, "left"=>24, "top"=>180, "label"=>"text"}

в БД у нас есть атрибут "category", у нас нет "label", поэтому я заменяю "пометка "ключ с" категорией ", используя фрагмент кода.

0 голосов
/ 20 сентября 2018

Попробуйте сделать пакетную вставку в neo4j.Есть несколько примеров того, как это сделать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...