百万が1M、1億が100M。
仮にデータが、1個100byteなら10GBだから、
1度にすべてのデータをメモリに読み込むと、スワップ領域が必須

だから、データを100分割でもして読み込めばよい

それか、データを一件ずつ取得して足すだけなら、
数千万種類の記号がソート済みなら、
同じ記号が続く間は足していき、次の記号に切り替わったら、
ファイルかDBに書き込む

データも100件ずつとか、
固定サイズの小さいバッファに読み込んで、
足したら読み込んだデータを捨てて、
次のデータをバッファに読み込む

要するにすべてのデータをまとめて、メモリに読み込まず、
バッファに読み込むだけの話