[java] вопрос по алгоритмам
Можно и свитч вместо мапы с функциями сделать.
какой свич? структура заранее неизвестна же. неизвестно даже количество элементов.
В примере приведен только один ряд. Как ты собираешься доказать, что его структура меняется?
2) rowMeta тоже может меняться - порядок полей в row может меняться в зависимости от того, из какого потока пришёл ряд (в одном потоке всё статично). Но во всех потоках количество и набор одинаков.
Ну и почему бы не создать на основе проперти файла уже готовый объект со всеми возможными полями, сериализовать его и для каждого ряда десериализовывать и присваивать значения, в конце обрубая нулевые ветви?
б) что-то я выпил и не совсем вас понимаю. ты предлагаешь в этом алгоритме в том месте где current.put(part, value) запоминать current как значение к строковому ключу name?
в какую сторону оптимизировать-то надо
Если допустимы сотни наносов-микросы, то можно обойтись кешируемым фаст рефлекшеном от cglib.
Если микросы - то можно просто рефлекшеном.
Если кол-во правых частей фиксировано, то можно для каждого случая написать код просто.
В сторону количества таких операций в секунду.
Нет, не фиксировано. Кроме того, я думаю развернуть первый маппинг, чтобы одно поле в несколько мест писать можно было
тогда вопрос сводится к тому, как быстрее всего сделать дерево заранее известной формы формы
100 000 docs:
standard 720 ms
serialized 4188 ms
Если почитать доки по тому, как она реализована, то становится ясно, почему. Но она натолкнула меня на другую идею - глубокое клонирование. Создаём мапу, которая знает, куда в себя писать, пишем значения и тут же клонируем от неё объект. Сначала попробовал com.rits.cloning.Cloner, охренел от его "производительности", потом сам реализовал:
100 000 docs:
standard 723 ms
cloned, variant1 19953 ms
cloned, variant2 149 ms
В общем пока наверно так оставлю.
А ты какую сериализацию использовал? ObjectOutputStream что ли?
В любом случае, как ты собираешься переносить относительные ссылки?
Оставить комментарий
kill-still
Есть маппинг Map<String, String> такого типа:И есть поток данных (каждый ряд является массивом значений). Привожу только один ряд:
Из них надо создать древовидную структуру (например HashMap<String, Object>) и отдать её дальше:
Сделать надо это быстро, потому что структура большая и ветвистая, поток очень интенсивный.
Как бы я это сделал в другом языке программирования:
Создал бы структуру-заготовку без данных и массив, где индексом является номер элемента из массива значений (из потока данных а значением - смещение поля под это значение в структуре-заготовке относительно указателя на рут. При получении следующего ряда бы просто клонировал заготовку и итерируясь одновременно по массиву значений и смещений записывал текущее значение по адресу ссылка_на_клон+текущее_смещение.
В яве пока что написал "в лоб":
Не уверен, что стоит лезть ради этого в unsafe, пока вот сижу и думаю, как бы соптимизировать без этого. Но что-то под вечер пятницы не приходит ничего путнего в голову. Может вы посоветуете что-нибудь?