public void run(int numIterations) throws IOException, RemoteException {
        engine.setEnableScheduler(true);



        int memoryBudget = 1200;
        if (System.getProperty("membudget") != null) memoryBudget = Integer.parseInt(System.getProperty("membudget"));

        engine.setMemoryBudgetMb(memoryBudget);
        engine.setEnableDeterministicExecution(false);
        engine.setAutoLoadNext(false);
        engine.setVertexDataConverter(null);
        engine.setMaxWindow(10000000); // Handle maximum 10M vertices a time.

        long t = System.currentTimeMillis();
        for(DrunkardDriver driver : drivers) {
            if (driver.getJob().getWalkManager() == null) {
                throw new IllegalStateException("You need to configure walks by calling DrunkardJob.configureXXX()");
            }
            driver.initWalks();
        }
        long initTime = System.currentTimeMillis() - t;

        /* Run GraphChi */
        logger.info("Starting running drunkard jobs (" + drivers.size() + " jobs)");
        engine.run(new GraphChiDrunkardWrapper(), numIterations);


        /* Finish up */
        for(DrunkardDriver driver: drivers) {
            driver.spinUntilFinish();
        }
    }