Search
Write a publication
Pull to refresh

Comments 37

А чем Power Query не угодил?) Ну или на край VBA родной?)

Power Query не подходит при нестандартных таблицах. Да и автоматизировать сложно.
VBA - я им плохо владею, он мне не нравится, он медленный, он плохо поддерживает кириллицу и постоянно блокируется Excel-ем.

Power Query не подходит при нестандартных таблицах

Видимо я с такими еще не сталкивался) Счета обрабатываются вроде довольно легко, хоть там и при переводе в Power Query изначально жутко мясо показывает)

Вы обрабатываете сами вручную, я правильно понимаю?

Нет конечно, формулу в Power Query один раз прописываю и дальше она уже сама все такие файлы обрабатывает)
Ну формулу руками пишу да, тут пока другого не придумал...

Понял. Я, скажу честно, плохо владею данным инструментом, потому пока сложно сказать. Можем ли мы связаться в телеграме? У меня ник тот же что и на хабре. Хочу со скриншотами обсудить

Честно скажу не читал статью. Но зацепил заголовок: "навайбкодил", "самый быстрый". Но в статье никаких замеров с аналогами нет. А с чего тогда вывод про самый быстрый? Потому что где то там используется Rust? Если только поэтому то вывод мне кажется поспешным а заголовок кликбейтным.

"[решение на openpyxl] съело всю доступную (из 32 гб) оперативку и 50 гб файла подкачки, и всё равно не справилось. Терпение кончилось быстрее. Потому я и навайбкодил написал своё решение. Новое решение (на компьютере клиента) справилось за 2 минуты с крошечным потреблением ОЗУ "

Но да, надо отдельно провести тесты. Я в основном судил "на глаз", там разница очень заметная.

rust выбрал потому что я его знаю. Чистый python довольно медленный.

Сделал тесты, x24 по скорости. А также (личные замеры) потребление памяти сократилось с 3000 мб до 37 мб. Причём openpyxl ещё таблицу сломал, Excel потребовал восстановления.

На основе документации

Ссылка на мои замеры

UPD: Обновил и саму статью. А вы мне ещё минусов наставили...

Почему редактирование очень медленное и как оно могло сожрать 80гб памяти.

Там же всего и надо распаковать зип архив с xml файлами, внести в них правки и запаковать обратно. Питон не должен был стать узким местом.

зацикливание возможно, обычный баг

Мне самому интересно почему так... но openpyxl невероятно медленный и жрёт ОЗУ как не в себя.

Скоро выложу тесты. Таблица там элементарная, потребление ОЗУ через мою библиотеку 37 мб было

UPD: Выложил

// Find the row containing the target cell.
let row_marker = format!("<row r=\"{}\"", row_num);
if let Some(row_start) = self
    .sheet_xml
    .windows(row_marker.len())
    .position(|w| w == row_marker.as_bytes())

Это ваша библиотека так с XML работает?

Да (точнее, там quick_xml используется)

Навайбкожено видимо. Потом в куче мест раскопирован шаблон работы, подозрительно напоминающий оной из readme, явно видно, что бездумной нейросетью:

  • весь файл вычитали в массив, но для чтения использует копирующие методы. Reader<[u8]>, который создается, может возвращать события, заимствующие данные событий из общего массива. Тем более, что все прочитанные таким образом события сразу выкидываются

  • подразумевается UTF-8. Хотя вряд ли будет что-то другое. По хорошему надо пользоваться декодером, который дает Reader

  • в одном месте Reader создали и настроили, а потом ниже еще раз (а первый не использовался)

Спасибо большое! Пока по UTF-8 сделал костыль, блокировка не UTF-8 сразу после ридера. Остальное исправил

редактирование уже имеющихся xlsx файлов это очень медленный процесс, гораздо медленнее чем чтение и запись. Поддержка такого режима есть только у openpyxl, там все операции очень долгие и требуют очень много ресурсов. "Точкой невозврата" стал случай, когда решение на openpyxl работало полчаса, съело всю доступную (из 32 гб) оперативку и 50 гб файла подкачки, и всё равно не справилось.

Простите, что!? Можете точный пример привести, что за операцию вы делали, которая привела к таким последствиям? Подозреваю, что проблема не в Python. Он обрабатывает несколько гигабайтные файлы с миллионами строк в таблицах легко и не напрягаясь.

Может пишет всё на диск после каждой операции?

Будь моя воля, показал бы оригинальный файл, но он конфиденциальный. В ближайшее время попробую создать имитацию с фальшивыми данными.

Openpyxl - очень странная штука, а точнее бесполезная. Судя по моему опыту - зависимость кол-ва оперативки от размера файла - чуть ли не квадратичная. Прочитать файл 1мб - легко, 10 мб - уже не так легко, но в пределах гига оперативки, а на 40мб у меня ушло 8+Гб оперативки. Больше никогда не использовал openpyxl после того случая. Хотя можно на досуге посмотреть, что там в репе происходит, пофиксить

Лучше мой Excelsior (я так назвал либу) улучши!

Reader и Writer для Excel файлов в pandas по умолчанию используют `openpyxl` но при загрузке и записи из pandas никогда с какими-то особыми тормозами или нехваткой оперативы не сталкивался (правда я только за Linux говорю, под win мало использовал). При этом pandas использует Cython и NumPy написанную на С для эффективной работы с данными и трудно поверить, что разработчики pandas стали бы использовать совсем не эффективную библиотеку для работы с Excel файлами. Есть `XlsxWriter`, про который пишут, что он может быть в 4 раза эффективней чем `openpyxl` при записи. У самого `openpyxl` есть оптимизированный режим только на запись. Для win возможно больше подойдёт IronXL для Python поскольку является компонентом .NET.
В общем я совсем не против чтобы для увеличения эффективности сделать библиотеки на высокопроизводительных языках типа C/C++, Go или Rust и использовать их в Python для оптимизации "узких мест", но что-то мне подсказывает, что сабж это не тот случай, а проблема скорее всего была из-за какого-то неправильного использования.

У openpyxl вполне хорошо работает режим записи, но тут речь про дозапись/редактирование уже готовых, а не создание новых файлов. Примерно такое

wirh pd.ExcelWriter(engine="openpyxl", mode="a" )

Почему я начал писать excelsior - именно этот режим, именно в append формате, слишком медленный. Write быстрый, append медленный.

а какие грязные данные и итоговые?

Тесты у меня есть, причём прямо xlsx файлы внутри github проекта (грязные). Папка tests Сейчас научил со стилями работать

Хорош! И пусть не верят и относятся к вайбкоду плохо, но чатгпт для меня написал уже с десяток разных ботов для телеги и даже пару игр с мультиплеером на html+js

Примеры игр можно? Флепи берд и тетрис можно найти в Гугле по первому запросу, чат жпт тут не нужен.

Дай ссылки на ботов и игры. Не вериться

Слава Богу хоть игры не на flash написал

Тут вайбкодил человек, который знает python и rust. Вайбкодить программистам ниже мидла запрещено, т.к. ни задачу сформулировать не могут, ни результат прочитать.

Я оказывается миддл :)

Помнится давно делал инструменты для обработки .docx и .xlsx, так вот стандартный подход подразумевает парсинг XML в объектную модель, работу с ней, а потом обратную запаковку. Все это жрет неимоверное количество ресурсов.

Тогда попробовал работать с XML как со строкой. Геморойно, костыльно, легко сломать разметку и сложно отлаживать. Но результат того стоит - такой подход и гораздо быстрее и тотально экономичнее по ресурсам.

Я с момента выхода статьи улучшил инструмент, и очень сильно. и даже переименовал

Он в ~500 раз быстрее чем openpyxl, и по возможностям приближается. И да, работа как со строкой.

Здесь похоже нормальный случай, но на всякий случай скажу (вдруг кто не знает): Использование assert'ов в коде не считается хорошим тоном. Например потому что их можно случайно отключить

Sign up to leave a comment.

Articles