Pergunta

Eu tenho que armazenar grande quantidade de cordas em C ++ mapa para manter cordas únicas e quando a corda já duplicado ocorre Eu só preciso incrementar o contador (pair.second). Eu tenho mapa usado c ++ e se encaixa bem a esta situação. Como o arquivo que o processamento é ido agora até 30gig Eu estou tentando manter isso em um arquivo em vez de memória.

Eu também veio através de trie que é mais rápido do que o mapa neste caso. Qualquer um ciente de arquivo apoiados implementação trie? Me deparei com um Trie implementação semelhante ao que eu estou procurando, mas não parece ser livre de erros ..

Foi útil?

Solução

Se você pode classificar seu arquivo que contém as cordas, em seguida, ler a lista e contagem ordenadas duplicatas seria fácil. (Você pode manter o arquivo original e criar um novo arquivo de strings ordenadas.) Classificando arquivos grandes de forma eficiente é a tecnologia de idade. Você deve ser capaz de encontrar uma utilidade para isso.

Se você não pode tipo , então considerar digestão as cordas. MD5 pode ser um exagero para a sua finalidade. Você pode improvisar alguma coisa. Para bilhões de cordas, você poderia usar 8 digere bytes. Use uma árvore (provavelmente uma BST) de digere. Para cada digest, armazenar os deslocamentos das cordas únicas de arquivos que produtos que digerir.

Quando você lê uma string, calcular é digerir, e procurá-lo. Se você não encontrar o resumo, você sabe a corda é único. Armazená-lo na árvore. Se você encontrar o resumo, verifique cada seqüência associada para um jogo e lidar com conformidade.

Para comparar strings, você terá que ir para o arquivo, já que tudo o que você armazenado é os deslocamentos de arquivo.

O que é importante lembrar-se que, se dois condensados ??são diferentes, as cordas que os produzidos devem ser diferentes. Se os resumos são os mesmos, as cordas não pode ser o mesmo, então você precisa verificar. Este algoritmo será mais eficiente quando há menos cordas duplicados.

Outras dicas

Como você está indo para carregar 30GB na memória de uma só vez? E uma vez que é um comportamento baseado em dicionário que você quer, eu imagino sempre que você inserir ou incremento, você precisa carregar o arquivo inteiro (mesmo se peça por peça) para pesquisa.

Eu sugiro usar um banco de dados. Isso é o que eles são para ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top