Pergunta

Eu tenho uma variedade de dados de séries temporais armazenados em um ou menos mais grade georreferenciados, por exemplo, um valor por 0,2 graus de latitude e longitude. Atualmente os dados são armazenados em arquivos de texto, por isso no dia-a-ano 251 que você pode ver:

251
 12.76 12.55 12.55 12.34 [etc., 200 more values...]
 13.02 12.95 12.70 12.40 [etc., 200 more values...]
 [etc., 250 more lines]
252
 [etc., etc.]

Eu gostaria de elevar o nível de abstração, melhorar o desempenho e reduzir a fragilidade (por exemplo, o código atual não pode inserir um dia entre as duas já existentes!). Nós tínhamos brinquei com hacks BLOB-y RDBMS e até mesmo replicando cada linha do formato de arquivo de texto como uma linha em uma tabela (uma linha por timestamp par / latitude, uma coluna por incremento longitude - Yecch).

Nós poderíamos ir a uma geodatabase "real", mas a sobrecarga de marcação de cada valor individual com um lat e longo parece proibitivo. O tamanho ea resolução dos dados não mudaram em dez anos e é improvável que fazê-lo.

Eu tenho noodling ao redor com colocar tudo em arquivos NetCDF, mas acho que temos que passar a mentalidade de arquivos inteiramente - Eu odeio que todo o meu software tem que descobrir nomes de datas, lidar com vários arquivos para vários anos , etc .. A alternativa, colocando todos os anos dez (e contando) de dados em um único arquivo, não parece viável também.

Todas as ideias brilhantes ou produtos?

Foi útil?

Solução

eu montei seus comentários aqui:

  1. Eu gostaria de fazer tudo isso "w / o de escrever meu próprio código de arquivo I / O"
  2. Preciso de acesso de "Java Rubi MATLAB" e "rotinas Fortran"

Quando você adicionar estes acima, você definitivamente não quer um novo formato de arquivo. Vara com o que você tem.

Se pudermos levá-lo a relaxar sua primeira exigência - ou seja, se você estaria disposto a escrever seu próprio código de arquivo I / O, então há algumas opções interessantes para você. Eu ia escrever classes C ++, e eu usaria algo como SWIG para fazer suas novas classes disponíveis para os vários idiomas que você precisa. (Mas eu não tenho certeza que você seria capaz de usar SWIG para lhe dar acesso a partir de Java, Ruby, MATLAB e Fortran. Você pode precisar de algo mais. Realmente não sei como fazê-lo, eu mesmo.)

Você também disse: "Na verdade, se eu tenho que ter arquivos, eu prefiro texto, porque então eu posso simplesmente entrar e mão-edit quando necessário."

A minha convicção é que esta é uma afirmação equivocada. Se você estaria disposto a fazer suas rotinas de I / O próprio arquivo, em seguida, há coisas muito inteligentes que você poderia fazer ... E como um fallback final, você poderia dar-se uma ferramenta que converte a partir do novo formato de arquivo para o mesmo velho formato de texto que você está acostumado ... E outra ferramenta que converte de volta. Eu vou voltar a isso no final do meu post ...

Você disse algo que eu quero para o endereço:

"alavancagem de 40 anos de otimização DB"

Os bancos de dados são destinadas para dados relacional, os dados não raster. Você não vai alavancar de ninguém DB otimizações com este tipo de dados. Você pode ser capaz de empinar seus dados em um banco de dados, mas que quase a mesma coisa.

.

Aqui é a coisa mais útil que eu posso te dizer, com base em tudo o que nos disse Você disse que este:

"Eu estou mais interessado em otimizar minha tempo do que a CPU de, embora a velocidade exec é bom!"

Este é francamente vai exigir TOOLS. Pare de pensar nisso como um arquivo de texto. Comece a pensar das tarefas comuns que você faz, e escrever pequenas ferramentas - em qualquer langauge (S) -. Para fazer essas coisas triviais para fazer

E se suas ferramentas de vir a ter um desempenho ruim? Adivinha o quê - é porque o seu arquivo de texto simples é um formato fétido. Mas isso é apenas minha opinião. :)

Outras dicas

Eu definitivamente mudar de texto para binário, mas manter a cada dia em um arquivo separado ainda. Você poderia nomeá-los de maneira tal que as inserções no meio não causa qualquer estranheza com índices, tais como ao incluir a data e tempo possível no nome do arquivo. Você também pode considerar a estrutura do arquivo se você tiver vários campos por localização, por exemplo. É comum a procurar um pequeno azulejo de um grande número de Timesteps? Nesse caso, você pode querer armazená-los como telhas que contêm dados de vários dias. Você não mencionou como os dados são acessados, que desempenha um grande papel em como organizá-lo de forma eficiente.

Esclarecimentos:

Eu estou surpreso que você adicionou "banco de dados" como uma das marcas, e considerou-o como uma opção. Por que você fez isso?

Essencialmente, você tem uma imagem de ponto flutuante 2D, único componente em cada passo de tempo. Você concorda com essa maneira de ver os seus dados?

Você também mencionou o desejo de inserir um dia entre as duas já existentes - o que parece ser uma coisa muito estranha a fazer. Por que você precisa fazer isso? Existe um novo dia entre 04 de maio e 5 de maio que eu não sei sobre?

É uma "compressão" das coisas que você gosta, ou você está apenas cansado de arquivos simples?

Será que um float ou um duplo ser suficiente para armazenar seus dados, ou você sente que precisa de precisão mais arbitrária?

Além disso, qual linguagem de programação (s) quer acessar esses dados com?

sua resposta sobre como armazenar os dados depende inteiramente do que você vai fazer com os dados. Por exemplo, se você só precisa recuperar especificando a data ou um intervalo de datas, em seguida, armazenar em um banco de dados como um BLOB faz algum sentido. mas se você precisa encontrar registros que tenham determinados valores, você precisa fazer algo diferente.

Por favor, descreva como você precisa ser capaz de acessar os dados /

Matt, muito obrigado, e da mesma forma longneck e jirv.

Este post foi em parte um experimento, testando a qualidade do discurso stackoverflow. Se vocês / galões / formas de vida alienígenas são representativos, estou vendido.

E no ponto, você já esclareceu o meu pensamento consideravelmente. Mente, eu ainda não pôde necessariamente implementar o seu conselho, mas sei que vou ser pensamento sobre isso muito a sério. >; -)

I pode muito bem deixar o formato de arquivo do mesmo, adicionar ao existente C e ou rotinas / Ruby para orçada em poucos baixo nível apresenta me falta (por exemplo, a inserção de Timesteps falta), e pendurar um front-end HTTP na tudo para que os dados podem ser consumidos por qualquer caixa que precisa dele, em qualquer língua é atualmente hoopy. Embora seja software legado principalmente imutável que constroem estes dados, estamos sempre chegando com novos consumidores para que, assim que a exigência de multi-linguagem / multi-computador (caramba, eu esqueci aquele?) Aplica-se ao lado da leitura, não lado a escrita. Isso também elimina uma enorme quantidade de questões de segurança.

Mais uma vez obrigado, pessoal.

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