package water.serial; import java.io.IOException; import org.apache.hadoop.fs.*; import water.*; /** * Model serializer targeting file based output. */ public class Model2HDFSBinarySerializer extends BinarySerializer<Model, Path, Path> { private final FileSystem _hfs; private final boolean _force; public Model2HDFSBinarySerializer(FileSystem fs, boolean force) { _hfs = fs; _force = force; } @Override public void save(Model m, Path f) throws IOException { assert m!=null : "Model cannot be null!"; AutoBuffer ab = null; // Save given mode to autobuffer m.getModelSerializer().save(m, saveHeader( m,ab=ab4write() ) ); // Spill it into disk _hfs.mkdirs(f.getParent()); FSDataOutputStream os = _hfs.create(f, _force); try { os.write(ab.buf()); } finally { os.close(); } } @Override public Model load(Path f) throws IOException { FSDataInputStream is = _hfs.open(f); byte buf[] = MemoryManager.malloc1((int) _hfs.getContentSummary(f).getLength()); try { is.readFully(buf); } finally { is.close(); } AutoBuffer ab=ab4read(buf); Model m = loadHeader(ab); m.getModelSerializer().load(m, ab); if (m._key!=null) { DKV.put(m._key, m); } return m; } @Override public Model load(Model m, Path f) throws IOException { throw new UnsupportedOperationException(); } private AutoBuffer ab4read (byte[] b) { return new AutoBufferWithoutTypeIds(b); } private AutoBuffer ab4write () { return new AutoBufferWithoutTypeIds(); } }