Важно, что нельзя:
2) Сохранять весь файл ни в какую-либо структуру, ни как массив байт
извини, но если хочешь высокой скорости, какую то информацию сохранить придется
Ускорение возможно только за счет траты памяти, сохраняя какую то информацию.
Варианты:
1. ускорить примерно 'в константу раз' можно, исключив проблемы с парсингом csv формата, т.е. сохранив информацию о координатах каждой строки и даже его элементах (ты должен хранить смещение в файле для каждой следующей строки и размеры/смещения каждой колонки относительно начала строки, особенно это актуально для строковых значений, экранирование символов " и \n тратит время на парсинг)
2. хранение информации о типах данных может так же заметно увеличить чтение данных из файла, причем речь не только о просто знании структуры (какая колонка какой тип ожидается) но и о фактическом значении в каждой строке (например факты расхождения с ожидаемой структурой), но это уже от задачи, редко когда требуется гибкая типизация, и как минимум, знание о том что строка требует или не требует обработку экранирования может ускорить это в 2 раза, очень часто это знание может быть заложено в код заранее, без предварительного чтения файла
3. хеширование значений в памяти, дает огромный прирост к поиску данных 'по значению', причем в зависимости от задачи это может быть хеширование как всей строки так и отдельных ее колонок или группы (как частный случай индексирования)
4. построение индексов, еще большая информация о данных, в зависимости от типа индекса, позволяет за константное/логарифмическое время решать такие задачи как поиск max/min/сравнение для числовых данных, или к примеру анализ строковых (например по словам или языковые запросы, т.е. наличие символов из наборов)
p.s. в догонку мелкие оптимизации
- работа с файлом, замапленным на кусок памяти (все ОС это поддерживают) дает огромный прирост по сравнению с чтением по кусочкам и тем более fgets (на самом деле при грамотном fread скорости не на много отличаются но речь просто об удобстве и единообразии кода)
- java это не совсем про хорошую скорость низкоуровневых операций, тут может оказаться что готовые но 'плохие' методы (реализованные на нативном коде) окажутся быстрее правильных идеологически но спотыкающихся о jvm прослойку, там где нужна скорость где действительно приходится так оптимизировать, бери c++, тем более благодаря последним десятилетиям развития std он стал очень и очень удобным не в ущерб скорости.
p.p.s.
надо быть очень странным человеком, чтобы хранить данные в csv файле вместо адекватной базы данных с уже готовыми инструментами индексации и поиска.
Настоятельно рекомендую освоить sqlite, в т.ч. как инструмент передачи данных другим людям, так как ну очень достали те кто использует excel или csv, изобретая бредовые форматы сериализации списков и сложных связей, постоянно спотыкаясь об мультиязыковую поддержку, даты и даже банальные символы точка и запятая у вещественных чисел
Кстати у sqlite встроенные механизмы импорта данных из csv, в 1 строчку