Как загрузить большой датасет в память сервера (+ пара сопутсвующих проблем)?
Думаю, для таких объемов лучше использовать какую-либо СУБД

1) Можете попробовать Clickhouse-local
https://clickhouse.com/docs/en/operations/utilitie...

$ echo -e "1,2\n3,4" | clickhouse-local --query "
    CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin);
    SELECT a, b FROM table;
    DROP TABLE table"
Read 2 rows, 32.00 B in 0.000 sec., 4987 rows/sec., 77.93 KiB/sec.
1   2
3   4

2) Также посмотрите на Dask + Parquet

https://docs.dask.org/en/stable/dataframe-best-pra...
https://docs.dask.org/en/stable/10-minutes-to-dask.html
Извиняюсь за неекропост

4000 колонок * 20кк строк * 1 байт значение (даже не надо в биты упаковывать, та ккак у вас 4 варианта значений)
это 80,000,000,000 байт, т.е. считанные 80 гигабайт данных в виде матрицы

какого вида нужна обработка? с линейным чтением справится просто массив