como lidar / arquivar / acessar grande quantidade de arquivos pequenos

0

rI assumiu a responsabilidade por um software que pré-processa dados em uma estrutura de diretórios profunda de milhões de arquivos pequenos (48k) com uma estrutura semelhante a geohash. Mover e copiar esses arquivos é uma verdadeira dor.

Primeiro, quero fazer backup dos dados em alguns arquivos para reduzir a carga do sistema de arquivos. Como próximo passo, quero melhorar a ferramenta para trabalhar com arquivos em vez de arquivos.

O primeiro problema já surge, em seguida, empacotar esses arquivos em um arquivo.

A ferramenta zip do Windows e o 7zip abortam o processo. Além disso, a ferramenta zip que vem com gnuWin32 Zip 3.0 (July 5th 2008), by Info-Zip cancela a operação com zip error: Out of memory (local_to_display_string)

Então estou procurando conselhos para duas perguntas:

  1. o que é um formato de arquivo apropriado (e uma ferramenta que pode lidar com esse caso de uso) que permite o acesso aleatório aos arquivos. Os dados dentro dos arquivos não precisam ser acessados aleatoriamente. já que os arquivos são pequenos o suficiente para serem carregados na memória.

  2. Existe uma Biblioteca C / C ++ que implementa o acesso ao arquivo o mais próximo possível do manuseio normal de arquivos, para que as alterações no código-fonte sejam mínimas possíveis? O próprio software usa o Qt / Boost.

por vlad_tepesch 11.01.2016 / 12:07

1 resposta

0

Em relação ao formato de arquivo apropriado, talvez você não precise arquivá-lo? Tente usar tar em vez de zip . Se isso não ajudar, tente organizá-los em estruturas hierárquicas, como git ou squid armazena grande quantidade de arquivos em seu diretório cache, separando os subdiretórios de nível superior x segundo nível, por exemplo: 16/256/64 , Assim, você terá menos solicitações de E / S não confirmadas quando tentar abrir esses arquivos.

Em segundo lugar, você deve considerar o armazenamento em cache, aqui estão algumas sugestões:

  • use Redis ou Memcached para armazenar em cache os dados na memória que já foram lidos,
  • tente colocá-los em algum sistema de arquivos, como ramfs ou tmpfs , para que resida na memória,
  • use o atendedor de memória virtual, como vmtouch , que pode mapear arquivos para a memória virtual, por exemplo, para colocar o arquivo na memória: vmtouch -vt file123.geo , ou para monitorar toda a pasta, tente: vmtouch -dl /path/dir

No entanto, se os arquivos são pequenos e consistem em alguns dados específicos (como geohashes), talvez seja importante importá-los para o banco de dados? Tais como MariaDB ou MongoDB Ou, talvez, indexe-os usando a Pesquisa do Solr ou a Pesquisa elástica ? Mas no final, tudo depende de seus requisitos técnicos específicos.

    
por 11.01.2016 / 12:32

Tags