public void bulkPut2( ByteChunk[] keys, ByteChunk[] values, int offset, int count ) {
		int size = 0;
		int[] sizes = new int[count];
		int[] offsets = new int[count];
		int[] indexSubPos = new int[count];
		for( int i=0; i<count; ++i ) {
			offsets[i] = size; 
			size += (sizes[i] = encodedPairSize( keys[offset+i], values[offset+i] ));
			indexSubPos[i] = indexSubPos(keys[offset+i]);
		}
		byte[] buffer = new byte[size];
		
		for( int i=0; i<count; ++i ) {
			encodePairData( keys[offset+i], values[offset+i], buffer, offsets[i] );
		}
		
		// Now that all the easy stuff's out of the way, do the I/O stuff
		
		FileLock fl = null;
		synchronized( this ) {
			try {
				try {
					if( fileChannel != null ) fl = fileChannel.lock(0, Long.MAX_VALUE, false);
					
					long newDataOffset = blob.getSize();
					
					// Load entire index
					ByteChunk index = blob.get( indexOffset, indexSize );
					for( int i=0; i<count; ++i ) {
						// Copy old list reference into new data
						copy( index.getBuffer(), index.getOffset()+indexSubPos[i], buffer, offsets[i], 8 );
						// Replace old list reference with reference to new chunk
						encodeLong( chunkRef( newDataOffset+offsets[i], sizes[i] ), index.getBuffer(), index.getOffset()+indexSubPos[i] );
					}
					
					// Save new data
					blob.put( newDataOffset, new SimpleByteChunk(buffer) );
					
					// Save entire index
					blob.put( indexOffset, index );
				} finally {
					if( fl != null ) fl.release();
				}
			} catch( IOException e ) {
				throw new RuntimeException(e);
			}
		}
	}