Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 04.08.2022
Сообщений: 59

Какая библиотека архивации для Python даёт произвольный доступ к файлу в архиве?

29.01.2023, 08:14. Показов 1554. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть большие архивы, в них текстовые файлы весом в несколько гигабайт. Необходимо получать доступ к произвольной точке в этом файле. (.seek).
Сейчас я использую для этого библиотеку zipfile и она работает достаточно медлено - чем дальше к концу файла нужно перейти, тем больше времени требуется, вплоть до десятков секунд. Но библиотек много - zlib, gzip,lzma,shutil,bz2,tarfile и.т.п.
Вы не знаете, какая из них даёт доступ к любому месту файла в архиве за линейное время, как и аналогичная функция seek для текстовых файлов? Очень нужно и дробить файлы на тысячи кусков не хочется. Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2023, 08:14
Ответы с готовыми решениями:

Произвольный доступ к файлу и ofstream
При работе с файлами возник вопрос. Из всего, что я попробовал, никак не смог открыть файл через ofstream кроме как ios::app и ios::out....

Произвольный доступ к файлу большого размера 4+гб
Предыстория. Поверхностно изучил файлы и пошел дальше, потом решил вернуться и изучить все глубоко. Все в голове поломалось, когда я понял,...

Кроссплатформенная библиотека для архивации
подскажите такую библиотекку обязательно кроссплатформенню я находил но они только под win или linux

21
 Аватар для rim41
1045 / 313 / 78
Регистрация: 16.03.2020
Сообщений: 954
29.01.2023, 09:18
Цитата Сообщение от Testfor Посмотреть сообщение
работает достаточно медленно
Если нужна скорость, то вообще питон не лучший вариант для ваших целей
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
29.01.2023, 09:22
Testfor, tar, без сжатия, возможно, поможет. А так, любые архивы с компрессией придется расжимать, на что будет тратится время.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
29.01.2023, 09:49
Цитата Сообщение от Testfor Посмотреть сообщение
какая из них даёт доступ к любому месту файла в архиве за линейное время, как и аналогичная функция seek для текстовых файлов?
- думаю, что задача решения не имеет.
0
2 / 2 / 1
Регистрация: 04.08.2022
Сообщений: 59
29.01.2023, 09:53  [ТС]
u235, rim41, Catstail,

Без сжатия не имеет смысла... Тогда архивы вообще не нужны. А по поводу питона - проблема не в нём. Смена языка даст прирост в скорости в несколько раз максимум. При этом доступ к любому месту в файле без разархивации остального ускорит работу в тысячи раз.

Я пробовал с разным уровнем сжатия, даже при минимальном ищет очень долго. Но задача точно имеет решение, если использовать алгоритм, сжимающий данные по блокам и индексирующий начало каждого блока. По сути это и будет разбивание одного файла на множество маленьких и их независимое сжатие. Только не так костыльно будет выглядеть. Может знаете, какой из алгоритмов сжимает данные блоками?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
29.01.2023, 10:06
Цитата Сообщение от Testfor Посмотреть сообщение
Может знаете, какой из алгоритмов сжимает данные блоками?
- Вам придется реализовать это самостоятельно... И возникает вопрос: а что Вы хотите достичь? Хранить библиотеки в сжатом виде? Зачем?
2
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
29.01.2023, 10:12
похоже вам нужно сначала реализовать такой алгоритм.

Цитата Сообщение от Testfor Посмотреть сообщение
сжимающий данные по блокам и индексирующий начало каждого блока
и как это будет работать по вашему? эти "куски" будут сжаты по разному, с разной степенью, ну найдем мы быстро нужный, но его же нужно тоже декомпрессить, а также декомпрессить и последующие если собираемся читать далее, причем на лету, что отнимет время. Кроме того это существенно ухудшит сжатие, ибо один условный кусок в файле не будет содержать столько повторяющихся (сжимаемых) последовательностей как файл целиком, какие то вообще не сожмутся, но были бы сильно сжаты при обычном подходе. Плюсом надо будет хранить мета-информацию о том на сколько блоков вы разбили исходный файл и мета-информацию для каждого куска (так как это по сути отдельные архивы).
2
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
29.01.2023, 10:19
Цитата Сообщение от Testfor Посмотреть сообщение
По сути это и будет разбивание одного файла на множество маленьких и их независимое сжатие.
В пределе вы прийдете к множеству файлов по одному символу. Сжатие будет нулевое. Еще у разбития на блоки есть такой минус: возможен вариант, когда нужные данные будут начинаться в одном блоке, а заканчиваться в другом.
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
29.01.2023, 10:24
я подозреваю что мы имеем дело с XY проблемой, хотелось бы узнать Х, а не способы решить Y
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
29.01.2023, 10:29
Цитата Сообщение от Welemir1 Посмотреть сообщение
я подозреваю что мы имеем дело с XY проблемой
- и мне так показалось
0
2 / 2 / 1
Регистрация: 04.08.2022
Сообщений: 59
29.01.2023, 10:33  [ТС]
Catstail,
Уже реализовал. Просто разрезаю файл на файлы по 1000000 символов и сжимаю в один архив, открываю нужный файл и в нём ищу через seek. Время поиска - доли секунды. Но это костыли и если понадобится файл целиком - его придётся обратно собирать. Несколько файлов в одном архиве хранить - путаница. А при добавлении нового файлы недостаточно его заархивировать - ещё и разрезать нужно.
Мне решение этой задачи нужно что бы читать архивные данные с кое-каких приборов из файлов. База данных не вариант данные слишком разнообразные. Файлы без сжатия тоже - в архивах файлы весят около 400 GB, а без архивов - 10 терабайт (формат json).

Welemir1, А что тут сложного? Разархивация файла занимает даже меньше времени, чем его чтение с диска. Я специально это даже тестировал. Что бы прочитать файл в чистом виде нужно больше времени, чем что бы прочитать архив и разархивировать файл. И нет, сжатие будет не сильно хуже. Я сравнивал сжатие файла целиком и сжатие этого же файла, разрезаного на куски по мегабайту. Разница считаные проценты. А если использовать один и тот же словарь для сжатия, то разницы не будет вовсе. Мета информация об архиве - размер сейчас, где начало в памяти сейчас, где начало в памяти до сжатия. Вот и вся информация, которая требуется. Технически всё возможно, я уверен, должны были существовать люди, которые это уже реализовали.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
29.01.2023, 10:43
Testfor, а если для хранения информации использовать БД?
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
29.01.2023, 10:45
Цитата Сообщение от Testfor Посмотреть сообщение
Технически всё возможно, я уверен, должны были существовать люди, которые это уже реализовали.
- при условии, что это кому-то нужно...
0
2 / 2 / 1
Регистрация: 04.08.2022
Сообщений: 59
29.01.2023, 10:50  [ТС]
u235, Ну я не собираюсь ударяться в крайности. С математической точки зрения поиск нужного блока занимает константное время. Поиск строки в нужном блоке логарифмическое время. Так что очевидно, что чем больше блоков - тем быстрее поиск, но меньше сжатие.

Поэтому я просто протестировал разбиения на файлы по 10kk, 1kk, 100k, 10k символов и некоторые промежуточные, посчитал время доступа к нужной строке в среднем с учётом ситуации, когда она оказывается в нескольких файлах. Оптимальным соотношением мне показались блоки в 1kk символов. Естественно хорошо бы иметь библиотеку, написанную профессионалами, которая берёт всё это на себя.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
29.01.2023, 10:50
Цитата Сообщение от Testfor Посмотреть сообщение
а без архивов - 10 терабайт (формат json).
- возможно, имеет смысл продумать свою структуру для этих архивов. Типа деревьев поиска или тому подобного. Ведь поиск в json-файлах Вы осуществляете не по произвольному контексту, а по конкретным наборам... Короче, оказаться от плоских файлов. Или загнать все в БД.
0
2 / 2 / 1
Регистрация: 04.08.2022
Сообщений: 59
29.01.2023, 11:10  [ТС]
Данные в формате json и крайне запутанные. Их парсинг и структурирование для добавление в базу данных - задача не на один день точно. И плюс данные всё время пополняются, а форматы меняются.

Добавлено через 12 минут
Catstail, Red white socks, Welemir1, u235,
Проблема X - есть терабайты файлов неправильного формата, строки в которых упорядочены по дате, которая в них содержится в формате json. По этой же дате я ищу файлах строки из нужного временного диапазона. Использую алгоритм больше-меньше. Вариант добавить в базу данных сложно реализуем.
Во-первых тогда нужно парсить исходные данные и приводить их к формату SQL. И будет очень сложно сделать так, что бы не возникло никаких ошибок, особенно учитывая, что в самих данных тоже встречаются куски SQL кода, а данные очень разнообразные.
Во-вторых доступ к данным есть у широкого круга лиц. А я знаю SQL недостаточно хорошо, что бы защититься от инъекции.
В-третьих данные часто требуются в исходном виде в виде файлов и придётся хранить две копии - в базе SQL и в исходном формате. Данные большие, место не бесплатное.
В-четвёртых данные поступают в формате json. И выводить их тоже нужно в формате json. Так что если парсить и структурировать данные - дополнительная нагрузка и двойная работа. И не факт, что не возникнет ошибок, так как, например, кавычки где-то используются одинарные, а где-то двойные.

Добавлено через 5 минут
И последний момент. Да, я собираюсь перевести все данные в базу данных в дальнейшем. Но это займёт несколько недель минимум. А поиск в архивах можно запустить уже завтра и он будет работать в это время.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
29.01.2023, 11:17
Но вы же все равно каким-то образом парсите файл? То, что это данные с приборов, а значит каким то образом унифицированы - прямая причина использования БД. Даже без грамотной архитектуры, получив самые базовые знания, вы удивитесь, насколько быстрой может стать работа. И насколько меньше места занимают они по сравнению с текстовой простыней. А уж с грамотной...
У меня ощущение, что я рассказываю достоинства таблицы умножения. Сорри.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
29.01.2023, 11:21
Testfor, прочитал проблему Х, не просто. Если есть время почитай например про МонгоДБ, это NoSQL БД, то ест не надо знать сиквель, прям вот живой жсон туда суешь и все. И достаешь тоже жсон и ищет она сама, просто задашь ей что индексировать по полю дата. Инъекции ей нипочем, она не знает сиквеля, жсоны для нее родные, причем хранит она их в своем сжатом формате (BSON) то есть места будут занимать меньше.
Это не гарантия, я же не вижу всей проблемы, но потенциально это снимает целый ряд проблем описаных выше(в теории вообще все проблемы).
0
2 / 2 / 1
Регистрация: 04.08.2022
Сообщений: 59
29.01.2023, 11:34  [ТС]
Red white socks, Welemir1,
Данные не только с приборов, но и с сайтов, с API и.т.п. Короче компания по маркетингу, агрегации данных, информированию, актуализации и всё в этом духе. Зарплат для найма профессиональных програмистов у них нет, поэтому самый квалифицированный работник - студент с третьего курса бакалавриата, который вам сейчас пишет. И паршу данные не я. Их парсит программа, написанная тем, кто работал тут до меня. Принимает json, выдаёт работникам читабельный формат данных. Трогать её нельзя, если развалится, починить некому. В SQL у меня данные поверхностные мягко говоря. Пару дней назад я тут спрашивал, почему команда SOURSE не работает что бы было понятно... Я понимаю, что всю эту систему нужно переделывать и как раз изучаю сейчас базы данных, но работы не на одну неделю, поэтому ищу как запустить прямо сейчас. Пока работает на данных возрастом недели две, так что слоган про актуальность начинает эту актуальность терять.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
29.01.2023, 11:36
Если посмотреть в корень проблемы (как раз Х ), то наверняка с приборов можно забирать данные более кошерным способом. Какой-нибудь OPC-сервер + скада, которая прекрасно работает с общепризнанной БД, типа мускуля или постгреса. И выборка тебе, и визуализация, и все остальное...

Добавлено через 44 секунды
Упс. Пока писал пост, этого не видел. Пардон
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2023, 11:36
Помогаю со студенческими работами здесь

Путь к файлу в архиве
У меня есть 4 txt файла в архиве рар (1.txt,2.txt,3.txt,4.txt) как мне написать чтобы комп видел этот файл в архиве? Я думал так: ...

Библиотека для Java которая дает разную информацию о компьютере
Есть небольшое приложение для java (windows) которое решает специфические задачи по отслеживанию некоторых файлов на разных компьютерах в...

Можно ли указать путь к файлу в архиве?
У меня есть файл archive.zip. В общем, в нём находится файл image.png. Я хотел бы сделать так: <img...

Python потерял библиотеку для отправки произвольный запросов
Вот так примерно выглядела отправка запроса: import somebiblioteka as req res = req.zapros( 'GET / HTTP/1.1', ...

Библиотека Ionic.Zip и пароль на архиве :)
Есть архив в папке , как мне достать файл из него если к примеру архив с паролем ? достаю файлы так { string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru