我正在尝试从一个 mysql 集移动到一个 postgres 集,我在移动时遇到问题的字段之一是 mysql LBLOB。我正在尝试将它移动到 postgres 中的 LargeObject 类型,但我遇到了一些速度问题。我在 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。一个 1MB 的文件大约需要 7 分钟。我的直觉告诉我这应该比第二个更有效率,但事实并非如此。
我将保留写入文件版本的代码片段,但它非常基础。它以相同的方式从数据库读取,然后将输出写入磁盘上的文件。然后我从磁盘读取文件并将其写入 LO。对于同一文件,该方法大约需要 8 秒。
这是怎么回事?
最佳答案
obj.write(b.toInteger().byteValue())
这种方法看起来效率不高。
尝试缓冲 I/O:
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);
}
}
适当调整缓冲区大小。
如果文件很大,您可能会发现操作系统在执行磁盘缓存(磁盘 I/O,以及内存管理)时出现问题。从互联网的这一端很难确定。尝试分析和比较这两种方法(至少,您可以使用 -Xprof
command line switch )。
关于java - 将 BLOB 从一个数据库读取到另一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2081367/