Рекурсивное выполнение обработки данных с помощью Java и SQLite

Кажется, ваш фрагмент содержит шаблоны на стороне сервера ({{ head | safe }}).

То, что вы просите, может быть сделано с использованием только HTML. Поэтому, если вы используете шаблонизацию на стороне сервера, вы можете просто сделать это так. Но дело в том, что даже если вы отображаете его с помощью Javascript в вашем браузере, вам все равно не нужно использовать scrollIntoView(). Если у вас есть элемент <a>, который имеет href="#id", где id - это идентификатор элемента другого элемента на странице, браузер будет прокручивать там.

.spacer {
  height: 300px;
  background-color: black;
}
<ul id="nav">
  <li>
    <a href="#entry1">entry1</a>
  </li>
  <li>
    <a href="#entry2">entry2</a>
  </li>
  <li>
    <a href="#entry3">entry3</a>
  </li>
</ul>
<div class="spacer"></div>
<div id="entry1">entry1</div>
<div class="spacer"></div>
<div id="entry2">entry2</div>
<div class="spacer"></div>
<div id="entry3">entry3</div>
<div class="spacer"></div>

5
задан Community 23 May 2017 в 10:32
поделиться

4 ответа

1) Во-первых, давайте посмотрим на простое помещение всего в памяти. Это просто, гибко, и прежде всего, быстро, решение. Недостатки включают то, что необходимо будет читать, все в память при запуске (дайте пользователю симпатичную панель загрузки, и они даже не заметят), и возможно должны сделать немного дополнительной работы, чтобы гарантировать, что все отражается к диску, когда пользователь думает, что это, так, чтобы данные не были потеряны.

В этом анализе я делаю некоторые универсальные предположения о Android/Дальвике, о котором я действительно не знаю так много, так надо надеяться, это несколько точно :) Помните, что G1 имеет 192 МБ RAM. Кроме того, Ваше предположение выше было макс. приблизительно 1 000 объектов.

Object superclass ~ 8 bytes
parent/child pointer ~ 4 bytes
date (long) ~ 8 bytes
name (non interned string avg 32 chars) ~ 64 bytes
x point (int) ~ 4 bytes
y point (int) ~ 4 bytes

Total = 92 bytes + possible memory alignment + fudge factor = 128 bytes
1000 items = 125kB
10000 items = 1.22MB

Примечание: Я понимаю, что, в то время как у ребенка может только быть один указатель, родитель может иметь несколько детей. Однако количество родителя-> указатели на подчиненный элемент (элементы - 1), таким образом, средняя стоимость родителя-> указатель на подчиненный элемент является (элементы - 1) / элементами ~ 1 элемент или 4 байта. Это принимает дочернюю структуру, которая не выделяет неиспользованную память, такую как LinkedList (в противоположность ArrayList)

2) Компьютерный фанат во мне говорит, что это было бы забавным местом для профилирования B + дерево, но я думаю, что это - излишество для того, что Вы хотите в данный момент :) Однако безотносительно решения, которое Вы заканчиваете тем, что приняли, если Вы не держите все в памяти, Вы определенно захотите кэшировать такой большой верхние уровни дерева в памяти, как Вы можете. Это может сократить объем активности диска решительно.

3) Если Вы не хотите идти вся память, другое возможное решение могло бы быть следующие. Bill Karwin предлагает довольно изящную структуру RDBMS, названную Таблицей Закрытия для оптимизации основанных на дереве чтений при создании записей более сложными. Объединение этого с высокоуровневым кэшем может дать Вам выигрыши в производительности, хотя я протестировал бы это прежде, чем взять мое слово на нем:

При оценке представления используйте то, что Вы имеете в памяти для оценки стольких дочерних элементов, сколько Вы можете. Для тех детей, которые не соответствуют, используйте соединение SQL между таблицей закрытия и плоской таблицей с соответствующим где пункт, чтобы узнать, существуют ли какие-либо дети соответствия. Если так, Вы будете отображать тот узел в своем списке результата.

Надеюсь, что это все имеет смысл и кажется, что он работал бы на то, в чем Вы нуждаетесь.

5
ответ дан 14 December 2019 в 09:00
поделиться

AFAICT можно использовать иерархические запросы (Google для "ПОДКЛЮЧЕНИЯ" "ЗАПУСКАЮТСЯ С") в SQLite...

-1
ответ дан 14 December 2019 в 09:00
поделиться

Это могло бы быть offtopic, но.. Вы рассмотрели использование сериализации?

Буферы Протокола Google могли использоваться для сериализации данных очень эффективным способом (время и пространство), необходимо будет затем создать подходящую древовидную структуру (взгляд в любой книге CS) для помощи с поиском.

Я упомянул буферы протокола, потому что, будучи библиотекой Google они могут быть доступными на Android.

Просто мысль.

1
ответ дан 14 December 2019 в 09:00
поделиться

I listened to Soonil and gave a try to the « closure table ». I added the following table :

################
#   Closure    #
################
# ancestor_id  #
#   item_id    #
################

If like me you never used that model before, it works that way :

You add a row for every direct or indirect relationship in the hierarchy. If C is a child of B, and B a child of A, you've got :

ancestor    item
   B         C
   A         B
   A         C      # you add the indirect relationship   
   A         A
   B         B
   C         C      # don't forget any item is in relation with himself 

Nevertheless, with this scheme, you are missing an important information : what are the direct relationships ? What if you want only the direct children of an item ?

For that, you can add a column is_direct with a bool in the closure table, or you can just keep the column parent_id in the item table. That what I did because it prevents me from rewriting a lot of my previous code.

The nice part is that I can now check if an item matches a date or a geocontext in one single query.

E.G, if I am browsing all the items contained in the item number 4 and want to get only the ones matching or containing a children matching the date D :

SELECT ti.parent_id, ti.id, ti.title 
FROM item AS di                                  # item to filter with the date
              JOIN closure AS c                  # closure table
                  ON (di.id = c.item_id) 
              JOIN item AS ti 
                  ON (c.ancestor_id = ti.id)     # top item to display
WHERE di.date = D                                # here you filter by date   
AND ti.parent_id = 4                             # here you ensure you got only the top items

So I can throw away all my *_cache tables. I still have a lot of work to do one UPDATE / DELETE / CREATE, but everything is centralized and most of it is procedural, not recursive. Pretty cool.

The only pain is that I must recursively add an item to all its ancestor. But getting the ancestors is a one query shot, so it's really reasonable. And of course the closure table take a lot of space, but in my case I just don't care. Don't forget to index it if you are looking for perfs...

Love this SQL trick, thanks a lot guys ! It's a bit tricky to get at first glance, but so obvious once you have it done.

2
ответ дан 14 December 2019 в 09:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: