Неправильный класс ELF - Python

Я пытаюсь установить эту библиотеку для сжатия LZJB. Ссылка на PyLZJB

Библиотека является привязкой для библиотеки C, файл находится здесь PyLZJB.so


К сожалению, копируя в каталог site-packages при импорте, я получаю ошибку неправильного класса ELF.

>>> import PyLZJB
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./PyLZJB.so: wrong ELF class: ELFCLASS32

Было бы здорово помочь. :)

PS: я использую Ubuntu 10.4 64bit


Редактировать:

Если бы кто-нибудь мог предложить мне альтернативный алгоритм сжатия, я был бы не менее счастлив. :)

Алгоритм предназначен для сжатия HTML, и ему также требуется поддержка распаковки / сжатия Javascript на стороне клиента.

Я очень надеюсь, что кто-то может помочь с этим. Спасибо, парни!


person RadiantHex    schedule 27.07.2010    source источник
comment
Кк, распаковка в JavaScript? Вы не можете воспользоваться встроенной поддержкой сжатия в большинстве современных браузеров и HTTP-серверов?   -  person Nicholas Knight    schedule 28.07.2010
comment
@Nicholas - Я полностью согласен: распаковка в JavaScript, который по сути является интерпретируемым языком, будет очень медленным по сравнению с собственным сжатием браузера (или операционной системы) (GZip). @RadiantHex - Просто любопытно: зачем тебе это?   -  person Marcel Korpel    schedule 28.07.2010
comment
@Nicholas: они Gzip GET-параметры в запросе?   -  person RadiantHex    schedule 28.07.2010
comment
@Marcel: Я отправляю множество отладочных данных с сервера и на сервер ... и мне действительно нужно это сжать. Кроме того, сжатие - это простой способ сериализации данных для запроса GET, не так ли? :)   -  person RadiantHex    schedule 28.07.2010
comment
@RadiantHex: Если вы помещаете достаточно данных в параметры GET, чтобы оправдать сжатие, почти наверняка что-то не так с дизайном вашего приложения. Я настоятельно рекомендую опубликовать новый вопрос с просьбой дать совет о том, как сделать то, что вы делаете, более разумным образом.   -  person Nicholas Knight    schedule 28.07.2010
comment
@Nicholas: Данные, которые я отправляю, уже довольно сильно уменьшены. На самом деле данных не так много, я просто хотел использовать сжатие LZJB, так как оно очень быстрое на стороне клиента. Иногда даже удается достичь 30% соотношения.   -  person RadiantHex    schedule 28.07.2010
comment
Вы рассматривали zlib? Это должно работать, и это довольно стандартный формат сжатия. zlib позволяет сжимать произвольную строку, а модуль gzip использует zlib для создания .gz файлов.   -  person Nathan Ernst    schedule 28.07.2010


Ответы (3)


Если бы кто-нибудь мог предложить мне альтернативный алгоритм сжатия, я был бы не менее счастлив.

Всегда есть старый добрый дефлят, гораздо более распространенный член семейства компрессионных LZ. реализация JavaScript. Как обрабатывать необработанное содержимое deflate с помощью модуля zlib Python.

Это большие накладные расходы в относительно медленном коде на стороне клиента для сжатия данных отправки, и нетривиально отправить необработанные байты, которые вы получите из него.

они Gzip GET-параметры в запросе?

Отправка формы GET в строке запроса должна по своей природе быть довольно короткой, иначе вы превысите ограничения длины URL-адреса браузера или сервера. Нет смысла сжимать что-то такое маленькое. Если у вас много данных, их нужно отправить в форме POST.

Даже в форме POST значение по умолчанию enctype равно application/x-www-form-urlencoded, что означает, что большая часть байтов будет закодирована как %nn последовательности. Это приведет к раздуванию вашей формы отправки, возможно, за пределы исходного несжатого размера. Чтобы отправить необработанные байты, вам нужно будет использовать форму enctype="multipart/form-data".

Даже тогда у вас будут проблемы с кодированием. Строки JS представляют собой Unicode, а не байты, и будут кодироваться с использованием кодировки страницы, содержащей форму. Обычно это должен быть UTF-8, но тогда вы не можете фактически сгенерировать произвольную последовательность байтов для загрузки путем кодирования в нее, поскольку многие последовательности байтов недействительны в UTF-8. Вы могли бы иметь байты в юникоде, кодируя каждый байт как кодовую единицу в UTF-8, но это увеличило бы ваши сжатые байты на 50% (поскольку половина кодовых единиц, превышающих 0x80, будет кодироваться в два байта UTF-8 ).

Теоретически, если вы не возражаете против потери надлежащей поддержки интернационализации, вы можете использовать страницу как ISO-8859-1 и использовать идиому escape/encodeURIComponent для преобразования между UTF-8 и ISO-8859-1 для вывода. Но это не сработает, потому что браузеры лгут и фактически используют кодовую страницу Windows 1252 для кодирования / декодирования контента, помеченного как ISO-8859-1. Вы можете использовать другую кодировку, которая сопоставляет каждый байт символу, но это будет больше накладных расходов на ручное кодирование и еще больше ограничит символы, которые вы можете использовать на странице.

Вы можете избежать проблем с кодированием, используя что-то вроде base64, но, опять же, у вас больше накладных расходов на ручное кодирование и 33% раздувания.

Таким образом, все подходы плохие; Не думаю, что вы извлечете из этого много пользы.

person bobince    schedule 27.07.2010

Вы используете 64-битный интерпретатор Python и пытаетесь загрузить 32-битное расширение, а это недопустимо.

Вам необходимо, чтобы интерпретатор Python и расширение были скомпилированы для одной и той же архитектуры. Хотя вы можете получить 32-битный интерпретатор Python, вероятно, было бы лучше получить 64-битное расширение.

Вам нужно получить исходный код для LZJB и создать его самостоятельно, чтобы получить 64-битный общий объект.

person R Samuel Klatchko    schedule 27.07.2010
comment
@ Самуэль: спасибо за ответ! Я немного запутался в том, как его построить, не могли бы вы дать мне несколько советов, пожалуйста? :) - person RadiantHex; 28.07.2010
comment
@RadiantHex, если в пакете используется distutils, обычно это так же просто, как запуск setup.py с вашей 64-битной средой выполнения Python. Иногда вам нужно прибегать к указанию CFLAGS=--march=x86_64 и CXXFLAGS=--march=x86_64 в вашей среде, в зависимости от того, как построен собственный код. Это предполагает архитектуру AMD x64, вам может потребоваться другой флаг, если вы используете Intel. - person Nathan Ernst; 28.07.2010

Вы можете либо запустить 32-битный Python, либо скомпилировать свой собственный PyLZJB, вместо того, чтобы использовать предварительно созданный двоичный файл. Или возьмите откуда-нибудь 64-битный двоичный PyLZJB.

person Borealid    schedule 27.07.2010