@ Override public Value chunkIdx ( int cidx ) { final long nchk = nChunks ( ) ; assert 0 <= cidx && cidx < nchk ; Key dkey = chunkKey ( cidx ) ; Value val1 = DKV . get ( dkey ) ; // Check for an existing one... will fetch data as needed if ( val1 != null ) return val1 ; // Found an existing one? // Lazily create a DVec for this chunk int len = ( int ) ( cidx < nchk - 1 ? CHUNK_SZ : ( _len - chunk2StartElem ( cidx ) ) ) ; // DVec is just the raw file data with a null-compression scheme Value val2 = new Value ( dkey , len , null , TypeMap . C1NCHUNK , _be ) ; val2 . setdsk ( ) ; // It is already on disk. // If not-home, then block till the Key is everywhere. Most calls here are // from the parser loading a text file, and the parser splits the work such // that most puts here are on home - so this is a simple speed optimization: // do not make a Futures nor block on it on home. Futures fs = dkey . home ( ) ? null : new Futures ( ) ; // Atomically insert: fails on a race, but then return the old version Value val3 = DKV . DputIfMatch ( dkey , val2 , null , fs ) ; if ( ! dkey . home ( ) && fs != null ) fs . blockForPending ( ) ; return val3 == null ? val2 : val3 ; }
Touching the DVec will force the file load .