我正试图从一个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分钟。我的直觉告诉我这应该比第二个更有效,但事实并非如此。
我将为写入文件版本保留代码片段,但它非常基本。它以相同的方式从db读取,但随后将输出写入磁盘上的文件。然后我从磁盘读取文件并将其写入LO。对于同一文件,该方法大约需要8秒。
发生了什么事?
答案 0 :(得分:2)
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)。