Hi,

I have been experimenting with using a int payload as a unique identifier, one 
per Document.  I have successfully loaded them in using the TermPositions API 
with something like:

    public static void loadPayloadIntArray(IndexReader reader, Term term, int[] 
intArray, int from, int to) throws Exception {
        TermPositions tp = null;
        byte[] dataBuffer = new byte[4];
        int intVal = -1;

        //System.out.println("loadPayloadIntArray(" + from + " -> " + to + ")");
        try {
            tp = reader.termPositions(term);
            tp.skipTo(from);
            do {
                tp.nextPosition();
                tp.getPayload(dataBuffer, 0);
                intVal = PayloadHelper.decodeInt(dataBuffer, 0);
                intArray[from] = intVal;
            } while (++from <= to && tp.next());
        }
        finally {
            if (tp != null) {
                tp.close();
            }
        }
    }

 
This works fine, it even allows me to use several threads in parallel to each 
load a part of the array, thus reducing the time taken.
However, performance is not as great as I would like - with indexes of ~4m docs 
it can take over 3 seconds.  (These are cold start times, no reader cacheing 
and OS read caches completely flushed).   Increasing the number of loader 
threads (calling the method shown) doesn't help much, which makes me suspect 
there is some synchronized stuff going on inside TermPositions.

So ... onto my question(s):

1) Because this approach is still faster than using FieldCache, my belief is 
that payloads are stored sequentially in the index - is this true?
2) If so, is there some raw, lower level I/O I can call which will allow me to 
load much bigger chunks of payload rather than a single int at a time?  

Thanks for any help in this area.

Chris


 


Reply via email to