Следующая функция, кажется, просто останавливается через некоторое время при запуске файла с ~ 21 миллионами строк. Он печатает до 15520000 и затем останавливается. Я проверил его с небольшими файлами, и в этом случае он отлично работает.
#lang racket
(define (read-csv name)
(define item-hash (make-hash))
(define user-hash (make-hash))
(define list-hash (make-hash))
(define item-number 0)
(define user-number 0)
(define n 0)
(with-input-from-file name
(thunk
(for ([line (in-lines)])
(define row (string-split line ","))
(match-define (list user item score) row)
(when (= item-number
(hash-ref! item-hash item item-number))
(set! item-number (+ 1 item-number)))
(when (= user-number
(hash-ref! user-hash user user-number))
(set! user-number (+ 1 user-number)))
(when (= 0(modulo n 10000))
(display n)
(display "\n"))
(set! n (+ 1 n))
(let ([l (hash-ref! list-hash user '())])
(hash-set! list-hash user (cons (cons item score) l))))))
(list item-hash user-hash list-hash))