Запись списка кортежей (int, float) в поток без преобразования в строку

Вот как я получил эту работу https://stackoverflow.com/a/27563953/2845977

$.ajax({
  url: '',
  success: function(data) {
    var blob=new Blob([data]);
    var link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download="";
    link.click();
  }
});

Обновлен ответ с использованием download.js

$.ajax({
  url: '',
  success: download.bind(true, "", "")
});

-2
задан Foobar 5 March 2019 в 20:40
поделиться

1 ответ

Существует много форматов, которые можно использовать для сериализации объектов Python в байты. Есть плюсы и минусы для каждого из них.

Если у данных есть только список кортежей целых и дробных чисел, это делает работу довольно простой.

Предположим, это данные:

data = 100 * [(1, 1.111), (18, 1.234), (555555, 0.001), (-1, 1e70)]

Какие из них попадают в категорию «струн», мне не ясно. Наиболее очевидный формат "строки" будет str(data). Насколько он велик?

>>> len(str(data))
5500

Это занимает 5500 байт. Вопрос требует чего-то более сжатого. Итак, мы ищем что-то намного короче, чем 5500 байт.

JSON - очень популярный формат (это также строка). Насколько он велик?

>>> len(json.dumps(data))
5500

Он имеет такой же размер (5500 байт), но, по крайней мере, он четко определен. Это может быть меньше? Как насчет BZipped JSON ?

>>> len(bz2.compress(json.dumps(data).encode('utf-8')))
131

Это намного лучше!

Это, вероятно, было очень хорошо из-за повторяющегося паттерна. Есть ли формат, в котором не используется архивирование? Может быть, рассол ?

>>> len(pickle.dumps(data))
862

Не так хорошо, как почтовый индекс (конечно!), Но все же хорошо.

Можем ли мы сделать рассол BZipped ?

>>> len(bz2.compress(pickle.dumps(data)))
155

Лучше, но нет никаких причин, чтобы он был лучше, чем BZipped JSON.

Как насчет другого формата? Вы можете преобразовать каждый кортеж в эквивалент этой структуры C , используя модуль struct :

struct {
    int i;
    double f;
};

Однако, тогда вы должны будете знать, насколько большой INT может быть. Python int может быть настолько большим, насколько вы хотите, но если вы, например, Знайте, что все числа находятся в диапазоне от 0 до 255, вам просто нужен один байт. Для float вам нужно 64 бита (то есть 8 байт), иначе вы потеряете точность. Таким образом, это увеличится до 1000 байтов. Не очень хорошо.

Есть также другие встроенные опции, описанные в документации Python по сохранению .

Вы также можете придумать свой собственный формат.

В конце концов, вы должны решить, что подходит вам больше всего.

0
ответ дан zvone 5 March 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: