![]() |
Быстро перемешать символы в строке
Добрый день, столкнулся с задачей перемешивания символов в строчке размером в сотню мегабайт.
Привет -> рПвите Само собой при помощи цикла, строчек и getCharAt это все происходит _очень_ медленно (порядка 2 минут) и сжирает феерический объем оперативы. Код AS3:
Код AS3:
|
Дайте ссылку пример на файла, если не трудно)
У меня есть идея насчет применения алгоритма Фишера-Йетса, но с примером было бы проще работать |
KumoKairo
Ссылка на .zip архив в котором лежит json, в поле bytearray которого лежит перемешанный по данному принципу base64. Если перемешать обратно и декодировать из base64, то получится .swf (в bytearray) Но можете любой длинный текст засунуть в base64 и оно ничем не будет принципиально отличаться от вышеназванного ужаса. http://sdrv.ms/17Ph50p Спасибо :-) |
Не вдаваясь в остальные подробности...
Код:
!(X операция Y == Z)Код:
X операция Y != ZКонкатенация строк в таких объемах - непрактично. Лучше один раз выделить память и потом в нее писать. Если вам нужно перемешать всю строку, то, ничего не поделаешь, вам ее всю прийдется поместить в память, но если можно предсказать распределение символов в строке, то можно было бы сделать блоками (и тогда одновременно памяти было бы задействовано меньше). Но, с точки зрения алоритмической сложности: никаких ускорений вам не светит. Скорость как была линейной, так и останется. |
wvxvw
Понятно, спасибо. Вообще вроде сделать работу быстрее, тот же самый файл распаковывается средствами Flash из zip на порядок быстрее, чем выполняется такая простейшая операция. Из этого я сделал вывод, что можно сделать решение "не в лоб". А вот какое - знаний не хватает По поводу if'а согласен, но эта часть кода выполняется один раз и потому не критично. А до рефакторинга не добрался еще. |
flasher190, можно еще на stackoverflow спросить, правда там форум слишком отягощенный оформительскими извратами, и за неправильный формат поста могут заминусовать, и проигнорить.
|
Цитата:
|
mikhailk,
у нас хитрый способ шифровки документов (все равно бесполезный, но ТЗ такое). Уже переформулировали задачу, решили сделать по другому. Теперь программа обрабатывает все за 5-10 секунд. Всем спасибо :) Но все равно обидно, что AVM2 работает в разы медленней Java, не говоря уже о нативном коде. |
Используйте воркеры (Workers).
|
Цитата:
swf (bytes) -> original string (base64) -> shuffled string -> original string (base64) -> swf (bytes) А вообще, вот. UPD. опоздал с постом :) |
alexcon314
Да, перемешивание обратимым Это лишь кусочек "шифрования" и данные перемешиваются по специальному алгоритму, со сдвигами, с шифровалкой по ключу и кучей других телодвижений :) Но это все равно глупость, ибо декомпил вскроет все тайны, а делаем мы офлайн ПО и с сервера ничего не получить. Заказчик обосновывает "это чтобы залетные юзвери не воровали, а если кто-либо целенаправленно будет - найдем и засудим". Так и живем. MikroAcse Недавно пытался использовать для другого проекта, но до конца не смог разобраться (использование воркеров выглядят как извращенный бубен в обход каких-то ограничений платформы) |
Для оффлайн ПО, где юзается флеш, есть AIR (и не только, см. например Zinc) Там возможностей работы с системой намного больше. Это я к тому, что ресурсоемкие задачи по шифрованию/дешифрованию там можно вынести в нативный для платформы код и не мучить флеш с его AS3 :). Например, написав .dll на с++ (в айр это именуется ANE). Кстати, и многопоточность нативно можно прикрутить при желании.
|
alexcon314
Именно под AIR я и пишу. Не знал, что можно включить в сборку нативные dll. Надо будет поэксперементировать, огромное спасибо :-) Кстати, если интересно, то пишу вот такую вот читалку книг. |
Т.е. я так понимаю, шифруются книжки? Тогда ANE - самое то.
|
alexcon314, да, спасибо огромное. Только вопрос встает в кроссплатформенность (включая линукс)
|
А вот тут туго. Адоб не поддерживает AIR на Linux. Так что ... плохо, вобщем, с линуксом.
Разве, только на Java написать ANE. Но и это, на мой взгляд, очень тернистый путь. Альтернатива - Wine, ну, может быть еще mono. Правда при этом приложение будет работать не нативно, а в другой виртуальной машине. Флеш так-то вообще с линуксов уходит. Zinc в этом отношении выглядит предпочтительней, хотя... Туго, короче, с линуксом. |
Цитата:
|
Возможно, для ускорения работы алгоритмов еще стоит попробовать domain memory
|
Цитата:
|
Из всего, что можно сделать для Линукса на флеше - Вайн самое работоспособное решение. Но есть другой момент... нормальный пользователь Линукса вряд ли будет устанавливать программы не из известных ему репозиториев. Как правило это только репозиторий системы + один-два общеизвестных, вроде Launchpad / Rpmfusion. Проприетарный софт ставят только те, кого заставляют это делать / нет другого решения. Например, в лаборатории могут установить всем сотрудникам какую-нибудь специальную программу, или, драйвера для какого-нибудь куска железа, ну, или игрушки.
Если это программа не на столько полезна / незаменима для линуксовой аудитории, я думаю, про этот сегмент рынка можно не вспоминать. Хотя, конечно, люди разные бывают... |
Я так понял, что речь шла о десктопных приложениях.
|
| Часовой пояс GMT +4, время: 23:21. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.