Como lidar com um arquivo de texto muito grande?

Atualmente, estou escrevendo algo que precisa lidar com arquivos de texto muito grandes (pelo menos alguns GiB). O que é necessário aqui (e isso é corrigido) é:

Baseado em CSV, seguindo o RFC 4180, com exceção das quebras de linha incorporadasacesso de leitura aleatório às linhas, embora principalmente linha por linha e próximo ao finalacrescentando linhas no final(mudando de linha). Obviamente, isso exige que o restante do arquivo seja reescrito, também é raro, portanto não é particularmente importante no momento

O tamanho do arquivo proíbe mantê-lo completamente na memória (o que também não é desejável, pois ao anexar as alterações devem ser mantidas o mais rápido possível).

Eu pensei em usar uma região mapeada na memória como uma janela para o arquivo que é movido se for solicitada uma linha fora do seu intervalo. Obviamente, nessa fase, ainda não tenho abstração acima do nível de bytes. Para realmente trabalhar com o conteúdo, tenho umCharsetDecoder me dando umaCharBuffer. Agora, o problema é que posso lidar com linhas de texto provavelmente bem noCharBuffer, mas também preciso conhecer o deslocamento de bytes dessa linha no arquivo (para manter um cache de índices e compensações de linha, para que não seja necessário varrer o arquivo desde o início novamente para encontrar uma linha específica).

Existe uma maneira de mapear as compensações em umCharBuffer para compensar na correspondênciaByteBuffer em absoluto? É obviamente trivial com ASCII ou ISO-8859- *, menos com UTF-8 e com ISO 2022 ou BOCU-1, as coisas ficariam feias (não que eu realmente espere os dois últimos, mas UTF-8 deve ser o padrão aqui) - e ainda apresenta problemas).

Eu acho que eupoderia basta converter uma parte doCharBuffer em bytes novamente e use o comprimento Ou funciona ou tenho problemas com sinais diacríticos, caso em que provavelmente poderia exigir o uso de NFC ou NFD para garantir que o texto seja sempre codificado de forma inequívoca.

Ainda assim, eu me pergunto se esse é mesmo o caminho a percorrer aqui. Existem melhores opções?

ETA: Algumas respostas a perguntas e sugestões comuns aqui:

Este é um armazenamento de dados para execuções de simulação, destinado a ser uma alternativa local pequena para um banco de dados completo. Também temos backend de banco de dados e eles são usados, mas nos casos em que não estão disponíveis ou não são aplicáveis, queremos isso.

Também estou suportando apenas um subconjunto de CSV (sem quebras de linha incorporadas), mas tudo bem por enquanto. Os pontos problemáticos aqui são praticamente os quais não posso prever quanto tempo as linhas são e, portanto, preciso criar um mapa aproximado do arquivo.

Quanto ao que descrevi acima: O problema que eu estava pensando era que eu posso determinar facilmente o final de uma linha no nível do caractere (U + 000D + U + 000A), mas não queria assumir que isso parece0A 0D no nível de bytes (que já falha no UTF-16, por exemplo, onde é0D 00 0A 00 ou00 0D 00 0A) Meu pensamento era que eu poderia tornar a codificação de caracteres alterável por não codificar detalhes da codificação que atualmente uso. Mas acho que eu poderia me ater ao UTF-8 e ingore todo o resto. Parece errado, de alguma forma, no entanto.

questionAnswers(7)

yourAnswerToTheQuestion