Executando verificação de segurança...
9

Além da história ser interessante, dá pra tirar algumas lições dela.

  • Acontece que GTA se esforça para analisar um arquivo JSON de 10 MB;
  • O parser do JSON em si é mal construído/ingênuo;

Na verdade eu voltaria alguns passos e questionaria se precisa mesmo de um arquivo JSON deste tamanho.

Fica aí um questionamento que todos nós deveríamos fazer. Hoje em dia todo mundo usa JSON pra tudo sem pensar, mas será que ele é o formato mais adequado para este caso? Se é algo que contém tantas informações e só vai ser lido pelo programa (ou seja, entendo que não precisa ser human readable), poderia muito bem estar em um formato binário, como por exemplo o Protobuf (que além de gerar arquivos bem menores que JSON, ainda tem - na média - o parsing mais rápido — para mais detalhes veja aqui e aqui, e também postei um teste que fiz comparando os dois formatos).

Escolher algo só porque todo mundo usa nem sempre é a melhor opção. Claro que muitas vezes não faz diferença, mas acho que faria muita no caso citado. O importante, como sempre, é avaliar caso a caso, e não ter medo de mudar conforme a necessidade. JSON tem suas vantagens, mas não serve - e nem deveria ser usado - pra tudo (e isso vale pra qualquer tecnologia que usamos).


Outro detalhe interessante é a escolha da estrutura de dados e a forma como era usada: um array para guardar os itens e a verificação de elementos repetidos. Como já dito, se podem ter itens repetidos, uma tabela de hash seria o mais adequado. E se os itens não se repetem, não precisaria verificar nada. Daí a importância de conhecer estruturas de dados, esta disciplina básica que faz parte dos fundamentos da computação, mas que ao mesmo tempo é tão negligenciada (até mesmo por "cursos" famosinhos, e por isso muita gente acha que é "teoria chata e inútil" — Não é!).

O que acontece é que muitas vezes lidamos com poucos dados, e aí tanto faz a estrutura escolhida porque a diferença é irrisória e até mesmo imperceptível. O problema só aparece em grandes volumes, como foi o caso do GTA, e aí conhecer bem as estruturas (pra que serve cada uma, em quais casos uma é melhor que outra, etc) faz toda a diferença.


Enfim, fica a lição. Nem mesmo um jogo AAA com orçamento de milhões de dólares está livre de cometer erros básicos. O que é meio triste, se parar pra pensar...

2

muito interessante sua colocação sobre o Protobuff, não conhecia e além disso são formas interessantes de resolver os problemas que se iniciaram errado e alguém provavelmente pode ter tido a mesma idéia mas preferiram deixar o jogo que já estava funcionando a 10 anos

EDIT: vale um post explicando o protobuff?
Eu meio que entendi a teoria rs.
e no caso existe um framework? escrevo human-readable e converte para protobuff?

2

Bom, eu usei pouco o Protobuf, então não sei se entendo tanto a ponto de escrever um post (talvez um introdutório, veremos).

A ideia básica é que vc cria um arquivo contendo o formato da mensagem (por exemplo, "Usuario" com os campos "id" e "nome", etc), e o compilador do Protobuf gera o código correspondente na linguagem desejada. Na documentação tem a lista de linguagens.

Basicamente, ele cria as classes que correspondem à mensagem que vc definiu. Aí vc usa essas classes para preencher com os dados e depois escreve tudo no arquivo binário. Este arquivo, por sua vez, pode ser lido por código em qualquer outra linguagem (desde que tenha sido gerado pelo mesmo arquivo com o formato).

Quanto a questão do human readable, já tem funções prontas para converter de/para texto (tanto para JSON quanto para um formato de texto próprio), bem útil para debugar. Não sei se tem framework pronto, mas meu chute é que alguém já deve ter feito :-)

1
1

Muito obrigado por disponibilizar!
Ficou muito bem organizado e entendível, melhor resposta que do ChatGPT kkkkk
Espero um dia precisar usar isso, na teoria eu entendi tudo :)