You don't need the bigger machinery of a segmented sieve for such a small range.  Here is a simple $O(n\log\log n)$ algorithm to calculate all $\mu(i)$ up to $n$ based on the Sieve of Erostothanes.  In fact, the sieve **does** fully factor all the square-free numbers; it just doesn't do it one at a time.

Depending on your computer, this approach is practical up to around $2^{30}$ at which point you need to start using higher-precision arithmetic and computing a range of $\mu(i)$ values in batches.

<!-- language: c# -->

    public static int[] GetMu(int max)
    {
        var sqrt = (int)Math.Floor(Math.Sqrt(max));
        var mu = new int[max + 1];
        for (int i = 1; i <= max; i++)
            mu[i] = 1;
        for (int i = 2; i <= sqrt; i++)
        {
            if (mu[i] == 1)
            {
                for (int j = i; j <= max; j += i)
                    mu[j] *= -i;
                for (int j = i * i; j <= max; j += i * i)
                    mu[j] = 0;
            }
        }
        for (int i = 2; i <= max; i++)
        {
            if (mu[i] == i)
                mu[i] = 1;
            else if (mu[i] == -i)
                mu[i] = -1;
            else if (mu[i] < 0)
                mu[i] = 1;
            else if (mu[i] > 0)
                mu[i] = -1;
        }
        return mu;
    }

Running `GetMu(1000000)` takes about 10 msec on my computer.