Чтение BLOB-объектов из одной БД в другую - PullRequest
1 голос
/ 17 января 2010

Я пытаюсь перейти от набора mysql к postgres, и одно из полей, с которыми у меня возникают проблемы при перемещении, - это mysql LBLOB. Я пытаюсь переместить его в тип LargeObject в Postgres, и у меня есть некоторые проблемы со скоростью. Я делаю это на Java / Groovy, и, честно говоря, потоковое вещание меня смущает.

Я испробовал два подхода: удерживать LBLOB в памяти и записать его непосредственно в LO, записать LBLOB на диск (в конце концов, это файл), а затем прочитать файл обратно в LO.

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

Вот первый подход.

InputStream ins = rs.getBinaryStream(1);
def b
while ((b = ins.read()) > -1) {
    obj.write(b.toInteger().byteValue())
}

«ins» - это ByteArrayInputStream, поэтому я читаю это в (в int), а затем записываю в «obj», LO. Это занимает около 7 минут для 1 МБ файла. Моя интуиция говорит мне, что это должно быть более эффективным, чем второе, но это не так.

Я сэкономлю фрагмент кода для версии записи в файл, но он довольно простой. Он читает из БД таким же образом, но затем записывает вывод в файл на диске. Затем я иду читать файл с диска и записываю его в LO. Этот подход занимает около 8 секунд для того же файла.

Что происходит?

1 Ответ

2 голосов
/ 17 января 2010
obj.write(b.toInteger().byteValue())

Этот подход не выглядит очень эффективным.

Попробуйте буферизовать ввод / вывод:

  public void drain(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int r;
    while ((r = in.read(buffer)) > -1) {
      out.write(buffer, 0, r);
    }
  }

Настройте размер буфера соответствующим образом.

Если файл большой, возможно, вы сталкиваетесь с проблемами в операционной системе, которая выполняет кэширование диска (например, дисковый ввод-вывод и управление памятью). Трудно сказать наверняка с этого конца интернета. Попробуйте профилировать и сравнить оба подхода (как минимум, вы можете использовать -Xprof ключ командной строки ).

...