Оптимальна структура даних для власного API


10

Я на початкових етапах написання основного режиму Emacs для мережі Stack Exchange ; якщо ви користуєтесь Emacs регулярно, це врешті принесе вам користь.

Для того, щоб мінімізувати кількість дзвінків до API Stack Exchange (обмежено 10000 за IP в день) і просто бути відповідальним громадянином, я хочу кешувати інформацію, яку я отримую з мережі, і зберігати її в пам'яті, чекаючи отримати доступ знову. Я дійсно застряг у тому, в якій структурі даних зберігати цю інформацію.

Очевидно, це буде список. Однак, як і у будь-якій структурі даних, вибір повинен визначатись тим, які дані зберігаються та яким чином вони будуть доступні. Що, я хотів би мати можливість зберігати всю цю інформацію в одному символі, наприклад stack-api/cache. Отже, без подальшої приналежності, stack-api/cacheце список консесів, введених останнім оновленням:

`(<csite> <csite> <csite>)

де <csite>було б

(1362501715 . <site>)

На даний момент все, що ми зробили, - це визначити простий список асоціацій . Звичайно, ми повинні заглибитись .

Кожен <site>- це список параметрів API (унікальний), а потім запитання зі списком:

`("codereview" <cquestion> <cquestion> <cquestion>)

Кожен <cquestion>- це, ви здогадалися, недоліки питань із останнім часом оновлення:

`(1362501715 <question>) (1362501720 . <question>)

<question>є мінуси questionструктури і список відповідей (знову - таки, consed з їх останнього часу поновлення):

`(<question-structure> <canswer> <canswer> <canswer>

і `

`(1362501715 . <answer-structure>)

Ця структура даних, ймовірно, найбільш точно описана як дерево, але я не знаю, чи є кращий спосіб зробити це, враховуючи мову, Emacs Lisp (яка не все так відрізняється від Lisp, якого ви знаєте і любите зовсім ) . Явні консистенції, ймовірно, непотрібні, але це допомагає моєму мозку краще обернутися навколо нього. Я впевнений, що <csite>, наприклад, просто перетвориться

(<epoch-time> <api-param> <cquestion> <cquestion> ...)

Побоювання:

  • Чи зберігають дані в такій потенційно величезній структурі, як якісь компроміси щодо продуктивності системи? Я хотів би уникати зберігання сторонніх даних, але я зробив усе, що міг, і не думаю, що набір даних в першу чергу є таким великим (для звичайного використання), оскільки це всього лише текст, прочитаний людиною, в розумній пропорції. (Я планую вилучити старі дані, використовуючи час на чолі списку; кожен успадковує свій час останнього оновлення від своїх дітей і так далі вниз по дереву. Наскільки ця клітина повинна мати місце: я не впевнений.)
  • Чи зберігають подібні дані якісь компроміси за ефективність за ті, які повинні використовувати їх? Тобто, чи встановлять і витягують операції страждають від розміру списку?

Чи є у вас інші пропозиції щодо того, як може виглядати краща структура?


Мені це +1, тому що я дуже хочу цей режим
Daniel Gratzer

@jozefg Я теж дуже хочу цього - це стажування висмоктувало більшу частину мого часу, але як тільки школа починає, слід досягти певного прогресу .
Шон Алредред

Я був дуже радий лише встановити плагін браузера, який дозволяє мені використовувати Emacs для заповнення вмісту текстового поля. Чи збираєтесь ви Emacs розуміти розмітку Wiki та відображати відформатований текст?
кевін клайн

@kevincline Ні, ідея полягає в тому, що вона буде просто виконувати утилітарні завдання: архіви місцевих питань; вдосконалене редагування коду (виведення в режим основного правильного режиму, аналогічний org) вставлення, <!-- language: blah>де це необхідно (залежно від режиму, в якому було виконано редагування коду); такі речі. Дивіться README на GitHub для отримання додаткової інформації, і відчувати себе найбільш вітати запропонувати функції. Чим більше я знаю про це перед рукою, тим краще це можна розробити. редагувати, не кажучи вже про клавіатури Emacs;)
Шон Алред

Відповіді:


1

Emacs lisp не оптимізований для обробки даних; можливо, вам буде вигідно використовувати Common Lisp для двигуна та Emacs лише для презентації.

Навіть якщо ви вирішили дотримуватися Emacs Lisp, я пропоную вам використовувати структуровані дані ( eieio) замість списків, а хеш-таблиці замість списків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.