我试图将boost对象加载到数据库中,因此我没有将其保存到硬盘中的文件中,而是将其保存为字节[]。但现在,忘掉数据库吧,因为我只想把助推器转换为字节[],然后从字节[]中找回助推器。
为了保存,我有一个Boosters的列表。
List<Booster> boosters = <Initialised somewhere else>;
for (Booster booster : model.getBoosters()) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
booster.saveModel(out);
out.close();
boostersAsByte.add(bos.toByteArray());
}
return boostersAsbyte;
然后我试图从保存的字节[]中检索这些助推器。
List<Booster> boosters = new ArrayList<>();
for (byte[] boosterAsByte : boostersAsbyte) {
boosters.add(XGBoost.loadModel(new ByteArrayInputStream(boosterAsByte)));
}
return new boosters;
我得到了这个恼人的错误。
ml.dmlc.xgboost4j.java.XGBoostError: [10:21:35] /xgboost/src/gbm/gbm.cc:20: Unknown gbm type
我试过从HDD中的文件中保存和恢复助推器,结果成功了;但是对于我的具体解决方案,我需要用字节[]来保存这些字节到DB中。
任何帮助都将是巨大的感激。谢谢!我想用字节[]来保存这些字节到DB中。
谢谢你的帮助。似乎ObjectInputStream需要一个InputStream而不是byte[]来初始化;但你给了我正确的提示:我不需要使用ObjectOutputStream和初始循环。
for (Booster booster : model.getBoosters()) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
booster.saveModel(bos);
boostersAsByte.add(bos.toByteArray());
}
}
这样一切都能正常工作:-)
你已经将bootster保存为一个对象(ObjectOutputStream),然后你必须通过ByteArrayInputStream将其读取为一个对象(ObjectInputStream)。例子
List<Booster> boosters = new ArrayList<>();
for (byte[] boosterAsByte : boostersAsbyte) {
boosters.add(XGBoost.loadModel(new
ObjectInputStream(new ByteArrayInputStream(boosterAsByte))));
}
return new boosters;