Несогласованная сериализация буфера IPC между Python и JavaScriptPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Несогласованная сериализация буфера IPC между Python и JavaScript

Сообщение Anonymous »

У меня возникла проблема с сериализацией буфера IPC в моем приложении C++. Буфер, сериализованный в C++, правильно десериализуется в Python, но в JavaScript происходит сбой с ошибкой несоответствия байтов метаданных.
Шаги для воспроизведения:
Код C++:

Код: Выделить всё

arrow::Result DataFrame::toBinary(std::vector columns,
std::optional const &index,
std::unordered_map const& metadata) const {
columns = columns.empty() ? this->columnNames() : columns;

std::shared_ptr array = m_array;
if (index) {
array = array->AddColumn(array->num_columns(), arrow::field(*index, m_index->type()), m_index).MoveValueUnsafe();
}

std::shared_ptr output_stream;
ARROW_ASSIGN_OR_RAISE(output_stream, arrow::io::BufferOutputStream::Create());

// Create IPC writer
std::shared_ptr writer;
ARROW_ASSIGN_OR_RAISE(writer, arrow::ipc::MakeStreamWriter(output_stream.get(), array->schema()));
// Write the RecordBatch
ARROW_RETURN_NOT_OK(writer->WriteRecordBatch(*array, std::make_shared(metadata)));

// Finalize the writer
ARROW_RETURN_NOT_OK(writer->Close());

// Retrieve the buffer
std::shared_ptr buffer;
ARROW_ASSIGN_OR_RAISE(buffer, output_stream->Finish());

return buffer;
}
Код Python:

Код: Выделить всё

import pyarrow as pa
import pyarrow.ipc as ipc

buffer = pa.BufferReader(binary_data)
reader = ipc.open_stream(buffer)
table = reader.read_all()
data_frame = table.to_pandas()
print(data_frame.columns)
print(data_frame)

JavaScript Code:

const { tableFromIPC } = require('apache-arrow');

const table = tableFromIPC(binary_data);
Ожидаемое поведение:
Буфер IPC, сериализованный в C++, должен корректно десериализоваться как в Python, так и в JavaScript.
Фактическое поведение:
p>
  • Python: десериализация работает правильно, и DataFrame печатается, как ожидалось.

    Код: Выделить всё

    Index(['o', 'h', 'l', 'c', 'v', 'vw', 'n', 'sma
    (c)|sma#00000', 'sma(c)|sma#00001', 't'], dtype='object')
    
  • JavaScript: десериализация завершается с ошибкой:

    Код: Выделить всё

    Error fetching market_data data: Error: Expected to read 131072 metadata bytes, but only read 120532.
    
Сообщения об ошибках:
  • JavaScript:

    Код: Выделить всё

      Error fetching market_data data: Error: Expected to read 131072 metadata bytes, but only read 120532.
    readMetadata message.mjs:99
    next message.mjs:48
    readMessage message.mjs:57
    _readNextMessageAndValidate reader.mjs:321
    next reader.mjs:295
    readAll reader.mjs:156
    tableFromIPC serialization.mjs:29
    transformModelData MarketDataProvider.tsx:38
    fetchData GenericProvider.tsx:35
    
Сведения о среде:

Код: Выделить всё

C++: Arrow version 14.0.1
Python: Arrow version 5
JavaScript: Arrow version 14.0.1, Node.js 14
Дополнительная информация:
  • Схема таблицы включает следующие столбцы: ['o', 'h', ' l', 'c', 'v', 'vw', 'n', 'sma(c)|sma#00000', 'sma(c)|sma#00001' , 't'].
Возможные причины:
  • Возможно, проблема связана с конфигурацией модуля записи IPC в коде C++.
  • Может быть несоответствие в том, как версии Arrow обрабатывают потоки IPC между Python и JavaScript.
Шаги, предпринятые для устранения неполадок:
  • Проверены сериализованные данные в Python, чтобы подтвердить правильность десериализации.
    Проверили метаданные и размеры буфера в C++ и Python.
  • Убедились, что одна и та же версия Arrow используется в средах C++, Python и JavaScript.
  • Проверено, что одна и та же версия Arrow используется в средах C++, Python и JavaScript.
    li>
Пожалуйста, помогите определить основную причину этой проблемы и предложите решение.
Компонент(ы)
C++, JavaScript, Python

Подробнее здесь: https://stackoverflow.com/questions/787 ... javascript
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»