    public void init() throws RowSpaceExceededException {
        current = null;
        this.tables = new HashMap<String, ObjectIndex>();
        if (!(path.exists())) path.mkdirs();
        String[] tablefile = path.list();
        File f;
        Random r = new Random(System.currentTimeMillis());
        for (int i = 0; i < tablefile.length; i++) {
            if ((tablefile[i].startsWith(prefix)) &&
                (tablefile[i].charAt(prefix.length()) == '.') &&
                (tablefile[i].length() == prefix.length() + 7)) {
                f = new File(path, tablefile[i]);
                String newname = tablefile[i] + "0100000" + (Long.toString(r.nextLong())+"00000").substring(1,5) + ".table";
                f.renameTo(new File(path, newname));
            }
        }
        tablefile = path.list();
        final HashMap<String, Long> t = new HashMap<String, Long>();
        long ram, time, maxtime = 0;
        Date d;
        for (int i = 0; i < tablefile.length; i++) {
            if ((tablefile[i].startsWith(prefix)) &&
                (tablefile[i].charAt(prefix.length()) == '.') &&
                (tablefile[i].length() == prefix.length() + 24)) {
                f = new File(path, tablefile[i]);
                try {
                    d = DateFormatter.parseShortMilliSecond(tablefile[i].substring(prefix.length() + 1, prefix.length() + 18));
                } catch (ParseException e) {
                    Log.logSevere("SplitTable", "", e);
                    continue;
                }
                time = d.getTime();
                if (time > maxtime) {
                    current = tablefile[i];
                    maxtime = time;
                }
                try {
                    t.put(tablefile[i], Table.staticRAMIndexNeed(f, rowdef));
                } catch (IOException e) {
                    Log.logWarning("SplitTable", "file " + f.toString() + " appears to be corrupted: " + e.getMessage());
                }
            }
        }
        Iterator<Map.Entry<String, Long>> i;
        Map.Entry<String, Long> entry;
        String maxf;
        long maxram;
        ObjectIndex table;
        while (!t.isEmpty()) {
            maxram = 0;
            maxf = null;
            i = t.entrySet().iterator();
            while (i.hasNext()) {
                entry = i.next();
                ram = entry.getValue().longValue();
                if (ram > maxram) {
                    maxf = entry.getKey();
                    maxram = ram;
                }
            }
            t.remove(maxf);
            if (maxf != null) {
                f = new File(path, maxf);
                Log.logInfo("kelondroSplitTable", "opening partial eco table " + f);
                try {
                    table = new Table(f, rowdef, EcoFSBufferSize, 0, this.useTailCache, this.exceed134217727);
                } catch (RowSpaceExceededException e) {
                    table = new Table(f, rowdef, 0, 0, false, this.exceed134217727);
                }
                tables.put(maxf, table);
            }
        }
        this.executor = new ThreadPoolExecutor(
                Math.max(tables.size(), Runtime.getRuntime().availableProcessors()) + 1, 
                Math.max(tables.size(), Runtime.getRuntime().availableProcessors()) + 1, 10, 
                TimeUnit.SECONDS, 
                new LinkedBlockingQueue<Runnable>(), 
                new NamePrefixThreadFactory(prefix));
    }

    public void init() throws RowSpaceExceededException {
        current = null;
        this.tables = new HashMap<String, ObjectIndex>();
        if (!(path.exists())) path.mkdirs();
        String[] tablefile = path.list();
        File f;
        Random r = new Random(System.currentTimeMillis());
        for (int i = 0; i < tablefile.length; i++) {
            if ((tablefile[i].startsWith(prefix)) &&
                (tablefile[i].charAt(prefix.length()) == '.') &&
                (tablefile[i].length() == prefix.length() + 7)) {
                f = new File(path, tablefile[i]);
                String newname = tablefile[i] + "0100000" + (Long.toString(r.nextLong())+"00000").substring(1,5) + ".table";
                f.renameTo(new File(path, newname));
            }
        }
        tablefile = path.list();
        final HashMap<String, Long> t = new HashMap<String, Long>();
        long ram, time, maxtime = 0;
        Date d;
        for (int i = 0; i < tablefile.length; i++) {
            if ((tablefile[i].startsWith(prefix)) &&
                (tablefile[i].charAt(prefix.length()) == '.') &&
                (tablefile[i].length() == prefix.length() + 24)) {
                f = new File(path, tablefile[i]);
                try {
                    d = DateFormatter.parseShortMilliSecond(tablefile[i].substring(prefix.length() + 1, prefix.length() + 18));
                } catch (ParseException e) {
                    Log.logSevere("SplitTable", "", e);
                    continue;
                }
                time = d.getTime();
                if (time > maxtime) {
                    current = tablefile[i];
                    maxtime = time;
                }
                try {
                    t.put(tablefile[i], Table.staticRAMIndexNeed(f, rowdef));
                } catch (IOException e) {
                    Log.logWarning("SplitTable", "file " + f.toString() + " appears to be corrupted: " + e.getMessage());
                }
            }
        }
        Iterator<Map.Entry<String, Long>> i;
        Map.Entry<String, Long> entry;
        String maxf;
        long maxram;
        ObjectIndex table;
        while (!t.isEmpty()) {
            maxram = 0;
            maxf = null;
            i = t.entrySet().iterator();
            while (i.hasNext()) {
                entry = i.next();
                ram = entry.getValue().longValue();
                if (maxf == null || ram > maxram) {
                    maxf = entry.getKey();
                    maxram = ram;
                }
            }
            t.remove(maxf);
            f = new File(path, maxf);
            Log.logInfo("kelondroSplitTable", "opening partial eco table " + f);
            try {
                table = new Table(f, rowdef, EcoFSBufferSize, 0, this.useTailCache, this.exceed134217727);
            } catch (RowSpaceExceededException e) {
                table = new Table(f, rowdef, 0, 0, false, this.exceed134217727);
            }
            tables.put(maxf, table);
        }
        this.executor = new ThreadPoolExecutor(
                Math.max(tables.size(), Runtime.getRuntime().availableProcessors()) + 1, 
                Math.max(tables.size(), Runtime.getRuntime().availableProcessors()) + 1, 10, 
                TimeUnit.SECONDS, 
                new LinkedBlockingQueue<Runnable>(), 
                new NamePrefixThreadFactory(prefix));
    }
