31.10.2012, 02:39
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
кстати, я так понимаю все выборки осуществляются перебором?
тогда вот ещё одна ссылка в тему: http://javascript.ru/blog/tenshi/yavascriptovoe-dao
реализация ужасная, но идеи стоит взять на заметку
__________________
.ня
|
|
31.10.2012, 09:48
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
О, ты начал говорить по существу. Стратегия поиска данных может быть разной, я специально не делал этого автоматически, чтобы сохранить гибкость: можно делать полные переборы, а можно делать выборки по множеству ссылок, можно переборы в интервалах, можно разводить поиск данных по потокам, можно делать индексы и управлять ими с помощью контекстного API. Для каждого случая нужно самому выбирать стратегию или написать специальный драйвер надстройку, как это делают, например, для монги. Сами циклы я стараюсь максимально оптимизировать, вот сейчас серьёзно думаю о неблокирующих режимах "из коробки", т.е. поддержка воркеров и таймаутов (первые, я думаю дадут серьёзный прирост производительности). Реализация неплохая (но до хорошо, мне пока ещё работать и работать), я сам понимаю, где есть узкие места, думаю над их решениями. Я почитаю твою статью и возможно подчеркну из неё что нить полезное, спасибо за ссылку.
UPD: почитал по ссылке, у меня всё также, кроме отсутствия ключей объектов (я такие объекты называю "гибридными" за то, что они содержат сильные стороны массивов и хешей), но их реализацию я уже давно задумал добавить в версию 4 своей либы, вместе с поддержкой воркеров. Ты бы почитал мануал на моем сайте, чтобы лучше понять, что же я сделал И я совсем не против объективных и трезвых советов.
Последний раз редактировалось kobezzza, 31.10.2012 в 09:56.
|
|
31.10.2012, 11:23
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от tenshi
|
смешивать трансформацию модели (из дата ориентированной во вью ориентированную) и шаблонизацию
|
Речь не о трансформации, а о фильтрации и группировке.
Сообщение от tenshi
|
смешивать эти два процесса - это классно лишь на простеньких демо-примерах.
|
Конкретные аргументы/примеры есть? Я знаю инструмент, который позволяет эффективно выполнить оба процесса в условиях большого высоконагруженного проекта. И я каждый день им пользуюсь. Так что твои слова для меня пока только слова.
Сообщение от tenshi
|
нужно создать модель представления, которая:
|
Модель всё равно вернёт data-ориентированные данные, так что это не выход. А если модель будет ещё и превращать их во view-ориентированные, то:
Сообщение от tenshi
|
(привет, копипаста)
|
Сообщение от tenshi
|
у тебя будет 2 шаблона отличающихся лишь запросами данных (привет, копипаста). будет 2 отдельные выборки из базы (привет, тормоза). в то время как логика подсказывает, что эффективней было бы один раз пройтись по массиву, раскидав записи по двум одинаковым моделям и отрендерить их одним же шаблоном.
|
"У меня" будет один шаблон, один запрос и две фильтрации.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Последний раз редактировалось B~Vladi, 31.10.2012 в 11:26.
|
|
31.10.2012, 12:03
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
> у меня всё также
как же создаются ключи?
> Речь не о трансформации, а о фильтрации и группировке.
одним словом это - выборка данных
> Я знаю инструмент, который позволяет эффективно выполнить оба процесса в условиях большого высоконагруженного проекта.
что же это за волшебное средство?
> Модель всё равно вернёт data-ориентированные данные
модель представления вернёт вью ориентированные данные. это яваскрипт, используй силу функции, люк, чтобы не было копипасты)
> "У меня" будет один шаблон, один запрос и две фильтрации.
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds.
__________________
.ня
|
|
31.10.2012, 12:20
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от tenshi
|
как же создаются ключи?
|
Формат данных у меня - произвольный JSON, т.е. сам пользователь выбирает, что ему удобней юзать: массив или хеш, но все методы работают как с тем, и с другим, но ввиду их особенностей в разных ситуациях кто-то работает значительно быстрее (перебор быстрее во много-много раз для массивов, но хеши позволяют делать прямые ссылки). Для ключей у меня реализовано контекстное АПИ, если коротко, то это конкретизация поиска, если с умом юзать этот механизм, то проблем со скоростью в рамках клиентской БД не будет вообще никогда (т.е. автоматически у меня не создаются зависимости и ключи, но АПИ для этого есть, чтобы разработчик сам решил, что и как ему сделать).
И не забывай, что мой фреймворк можно юзать, как простой фреймворк данных (новые методы работы с массивами и объектами) или абстрактно представлять как некоторую БД, как удобнее и лучше должен решать сам разработчик.
// Все чётные элементы увеличить на 1 (вместо строковых сокращений функций моно юзать простые функции)
$C([1,2,3,4,5,6,7]).forEach(':data[i]++', ':el % 2 == 0');
Сейчас есть проблемы при тупом переборе более 10к элементов за раз, но после внедрения воркеров я думаю проблема исчезнет (в рамках клиентских задача вряд ли будут коллекции по 10кк элементов).
Последний раз редактировалось kobezzza, 31.10.2012 в 12:35.
|
|
31.10.2012, 13:18
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от tenshi
|
что же это за волшебное средство?
|
Ты не поверишь, XSLT.
Сообщение от tenshi
|
модель представления вернёт вью ориентированные данные
|
Привет, копипаста моделей.
Сообщение от tenshi
|
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds.
|
Охх... Ну смотри:
<?xml version="1.0" encoding="UTF-8"?>
<ten:root xmlns:ten="TEN" xmlns="http://www.w3.org/1999/xhtml">
<!-- Один шаблон для списка пользователей, может лежать в отдельном файле -->
<ten:block name="user-list">
<ul>
<ten:each array="this" item="user">
<li><ten:echo data="user.name" /></li>
</ten:each>
</ul>
</ten:block>
<!-- Одна выборка всех пользователей. Если бы нам потребовались только совершеннолетние, в методе getUsers можно реализовать параметры fromAge и toAge. Пример приводить не буду -->
<ten:async method="getUsers" arguments="userList">
<ten:context object="new Collection(userList)">
<!-- Первый список, первая фильтрация -->
<ten:render block="user-list" context="this.get(':el.age < 18')" />
<!-- Второй список, вторая фильтрация -->
<ten:render block="user-list" context="this.get(':el.age >= 18')" />
</ten:context>
</ten:async>
</ten:root>
Ну и сама разметка списка может быть кастомизирована для каждого конкретного случая.
В итоге:
Сообщение от B~Vladi
|
"У меня" будет один шаблон, один запрос и две фильтрации.
|
И никакой копипасты.
Такой подход используется и в XSL.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Последний раз редактировалось B~Vladi, 31.10.2012 в 13:22.
|
|
31.10.2012, 15:10
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
> АПИ для этого есть
где про него почитать?
> $C([1,2,3,4,5,6,7]).forEach(':data[i]++', ':el % 2 == 0');
не убедительно
[1,2,3,4,5,6,7].map(fucntion( val ){ return ( el % 2 ) ? el : el + 1 })
> после внедрения воркеров я думаю проблема исчезнет
и куда же она денется? вместо использования ключей для быстрой выборки, ты выносишь перебор в асинхронную задачу, превращая клиентский код в лапшу из колбэков.
__________________
.ня
|
|
31.10.2012, 15:20
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от tenshi
|
где про него почитать?
|
На сайте в учебнике
Сообщение от tenshi
|
не убедительно
|
Я привёл элементарный пример, он где угодно элементарно решается, а вот сложный делать стандартными методами ты запаришься, а у меня всё та же одна строчка (например, начиная с конца массива, отбросив первые 10 успешных итераций и если итерация меньше 20-ти применить сортировку по фильтру и возвести в n степень). Ты придираешься к словам, вместо того, чтобы прочитать учебника и не задавать мне глупых вопросов.
Сообщение от tenshi
|
и куда же она денется? вместо использования ключей для быстрой выборки, ты выносишь перебор в асинхронную задачу, превращая клиентский код в лапшу из колбэков.
|
Проблема больших данных - это проблема архитектуры приложения, а не моей библиотеки, я лишь дам возможность её решить.
Я не навязываю стратегию решения задачи, разработчик сам решает что и как ему сделать. Тебе не нравится моя либа, т.к. ты писал свой велосипед, который никому кроме тебя не нужен, более того судя по кол-ву комментов люди даже не поняли, что ты хотел написать, у тебя нет ни доки ни мана, даже ссылка битая, о чём тут ещё говорить?
Последний раз редактировалось kobezzza, 31.10.2012 в 15:26.
|
|
31.10.2012, 15:24
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
> Ты не поверишь, XSLT.
ты прав, не поверю. открой для себя хотябы двухпроходной xslt - это классно. на первом проходе делаем reduce данных от серверов, формируя модель представления. на втором - накладываем вёрстку. в качестве бонуса - возможность в любой момент посмотреть какая формируется модель - для дебага куда полезней, чем копаться в мешанине html-тегов.
> Привет, копипаста моделей.
она в любом случае будет. вопрос лишь в том, вносить ли в эту копипасту ещё и шаблоны или нет. к тому же не забывай про агрегацию и наследование, которые в js-моделях использовать куда проще, чем в шаблонах.
__________________
.ня
|
|
31.10.2012, 15:45
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
> Один шаблон для списка пользователей, может лежать в отдельном файле
замечательно, тут ты рендеришь модель отображения
> Одна выборка всех пользователей. Если бы нам потребовались только совершеннолетние, в методе getUsers можно реализовать параметры fromAge и toAge. Пример приводить не буду
а тут формируешь две модели и рендеришь их. то же самое на js могло бы выглядеть проще:
var AllUsersModel= Model( function ( userList ){
var model= { mature: [], amature= [] }
userList.forEach( function( user ){
model[ ( user.age >= 18 ) ? 'mature' : 'amature' ].push( user )
}
return model
} )
AllUsersModel( userList ).renderTo( place )
__________________
.ня
|
|
|
|