В настоящее время я использую JSON в качестве формата сериализации для передачи простого хэша, содержащего строки, числа и массив, из Ruby в сценарий Python:
IO.popen('./convert.py', 'w') do |w|
w.write({ :height => height, :width => width, :id => job_id, :data => pix }.to_json)
w.write "\n"
w.close_write
end
В данном случае height
, width
и job_id
- все числа, а pix
- массив массивов целых чисел.
Выполняемый скрипт python:
#!/usr/bin/env python
from PIL import Image
import json
import sys
output = json.load(sys.stdin)
width = output['width']
height = output['height']
name = 'images/' + str(output['id']) + '/image.bmp'
data = [ tuple(datum) for datum in output['data'] ]
img = Image.new("RGB", (width, height))
img.putdata(data)
img.save(name)
бит быстрого тестирования с использованием массива с 3,9 миллиона значений (вероятно, около 1/4 размера, который обычно будет использоваться), показал, что сценарий занимает около 105 секунд и 90 секунд со всеми строками ниже output = ...
закомментировал. Очевидно, было бы хорошо, если бы сериализация не занимала 85% времени обработки для такого простого сценария.
Единственный способ ускорить это, о котором я могу думать, - это найти некоторую форму двоичной сериализации / маршалинга, которая может использоваться для передачи данных из Ruby в Python. К сожалению, мне не удалось найти такую систему, только RMarshal , который, похоже, может работать иначе.