У меня возникла следующая проблема: я пытаюсь реализовать симулятор для цепочек поставок. Это приведет к большому количеству событий EPCIS (событий, которые происходят у читателей RFID). Затем эти события должны быть записаны в CSV-файл, чтобы загрузить их в любую базу данных и запустить на них аналитические алгоритмы.
Симулятор реализован с использованием python и отлично работает. То, что я сейчас пытаюсь сделать - это буферизовать запись событий в файл, чтобы уменьшить время, необходимое для доступа к диску. Просматривая документацию по python, я наткнулся на io.BufferedWriter, который звучит точно так же, как и то, что я искал. Во всяком случае, я не могу заставить его работать.
Вот что я сделал до сих пор. Я реализовал свой класс CsvWriter
, который наследуется от RawIOBase и управляет дескриптором файла. Когда он создается, он создает BufferedWriter
, передавая сам по себе, как параметр raw
(может ли это быть проблемой?)
class CsvWriter(AbstractWriter):
def __init__(self, filename):
self.filename = filename
self.file = self.openFile()
self.buffer = BufferedWriter(self, settings.WRITE_THRESHOLD)
Когда я знаю, что хочу написать что-то, я называю write_buffered
с буферизацией, которая выглядит так:
def write_buffered(self, data_dict):
self.buffer.write(b';'.join(map(str, data_dict.values())) + '\n')
Реальные write
методы, которые (как я понял) должны быть реализованы в самом классе CsvWriter
, выглядят так:
def write(self, data):
if self.file.closed:
self.file = self.openFile()
return self.file.write(data)
Проблема в том, что при попытке запустить симулятор я получаю следующую ошибку:
IOError: raw write() returned invalid length -1 (should have been between 0 and 78)
Кто-нибудь из вас знает, как это исправить?