5
respostas

Estouro de memoria ai deserializar JSON

Tenho uma aplicação console que necessita consumir varias vezes um JSON de um cliente. O cliente possui um catalogo com 10 mil produtos distruibuidos em 100 páginas, com 100 produtos cada. Para consumir esse JSON faço 100 consultas, uma para cada página, porém quando chega na página 68 há o estouro de memoria (SystemExceptionMemory) no momento que estou deserializando (utilizado a library Newtonsoft).

5 respostas

Olá, Jean

Vamos precisar de alguns detalhes da sua implementação:

  • O catálogo é mantido em banco de dados?
  • A consulta ao catálogo de produtos é feita com Entity Framework?
  • Qual o código da consulta ao catálogo? Você está fazendo a consulta à página desejada com os métodos Skip() e Take do LINQ To Entities?
  • Qual o texto exato da exceção que está sendo lançada?
  • O catálogo é mantido em banco de dados?
  • A consulta ao catálogo de produtos é feita com Entity Framework? => Não, via ADO.
  • Qual o código da consulta ao catálogo? Você está fazendo a consulta à página desejada com os métodos Skip() e Take do LINQ To Entities? => Não
  • Qual o texto exato da exceção que está sendo lançada? => Resposta abaixo

O problema não está na persistência de dados e sim no momento em que estou buscando os dados no parceiro e deserializando o JSON. Segue o trecho do código onde o erro ocorre e a mensagem de exceção:

public static T DeserializarObjeto(T list, string json)  {       
    return JsonConvert.DeserializeObject(json); 
}
{The function evaluation was disabled because of an out of memory exception.}

Jean, qual o tamanho da string json? (consulte json.Length()) Quando ocorre o estouro, esse json contém quantos produtos?

Cada página retorna um json 500kb e cada json desse tem 100 produtos.

http://integracao.maquinadevendas.com.br/v2/produto?parceiroId=XX&pagina=559
{
    "success": true,
    "data": {
        "dadosPaginacao": {
            "totalProdutos": "440941",
            "produtosPorPagina": 100,
            "totalPaginas": 4410,
            "paginaAtual": "559"
        },
        "produtos": [
            {
                "produtoId": 523550,
                "fabricanteId": 178,
                "codigo": "C523550",
                "nome": "Samsung Galaxy A5 4G Duos A500M Preto - Smartphone - Dual Chip, Android 4.4, Câmera 13MP, Frontal 5MP, Quad Core 1.2 Ghz, Tela 5, 4G, Wi-fi e GPS",
                "descricao": "",
                "vendeAvulso": 1,
                "emLinha": 0,
                "lojaId": 44,
                "precoPor": 0,
                "precoDe": 0,
                "atributosSubstituicao": [],
                "atributosCorTamanho": [],
                "codigoRetail": null,
                "loja": "Celulares e Telefones",
                "categoriaId": 491,
                "categoria": "Smartphones",
                "subCategoriaId": 496,
                "subCategoria": "Samsung",
                "fabricante": "Samsung",
                "status": 0,
                "quantidade": 1,
                "parcelamentoMaximoSemJuros": 1,
                "caracteristicas": {},
                "dataAlteracao": "0000-00-00 00:00:00",
                "medias": {
                    "jpg": [
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751459_20150406181505.jpg",
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751461_20150406181512.jpg",
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751463_20150406181521.jpg",
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751466_20150406181531.jpg",
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751468_20150406181540.jpg",
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751469_20150406181554.jpg",
                        "http://parceiroimg.maquinadevendas.com.br/produto/C523550_3751470_20150406181608.jpg"
                    ]
                },
                "itensIncluso": [
                    "Fone de Ouvido",
                    "Cabo USB",
                    "Bateria",
                    "Carregador",
                    "Aparelho\t \t\t\t \t\t\t"
                ],
                "altura": 0.7,
                "comprimento": 13.9,
                "largura": 7,
                "peso": 0.14,
                "alturaEmbalagem": null,
                "comprimentoEmbalagem": null,
                "larguraEmbalagem": null,
                "pesoEmbalagem": null,
                "disponivel": 0,
                "url": "http://www.optmais.com.br/Produto/Samsung-Galaxy-A5-4G-Duos-A500M-Preto-Smartphone-Dual-Chip-Android-44-Camera-13MP-Frontal-5MP-Quad-Core-12-Ghz-Tela-5-4G-Wi-fi-e-GPS/44-491-496-523550",
                "parcelamento": [],
                "filhos": []
            }
     ....... (Aqui vem mais produtos)
        ]
    },
    "mensagem": "Sucesso",
    "codigo": 0
}

Tenho a solução.

Criamos um processo que deserializa o arquivo JSON em pequenos lotes de 100 em 100 e assim não obtemos mais erros.

Obrigado pela ajuda.