Как прочитать ~ 4 ГБ из нескольких файлов json в один словарь, для которых самые внутренние значения являются списками / массивами? - PullRequest
0 голосов
/ 10 апреля 2020

Проблема и MWE

Я проверил вопросы / ответы относительно того, как загружать .json файлы, используя dump (s) и загружая . Этот источник (под подзаголовком Пример простой десериализации ) предполагает, что я могу использовать json.load(read_file) для загрузки каждого .json файла. Предположим, что у каждого есть примерно 4 гигабайта файлов .json (полученных из Open SuperNova Catalog ), для которых содержимое одного файла показано внизу этого поста.

Я читал, что порция в сочетании с генераторами / yield является одним из способов работы с большими наборами данных, но я не уверен, подходит ли это для этого или нет сценарий использования - сколько данных слишком много? Может быть, существует способ объединения данных с помощью jsoni c, и если да, следует ли объединять все данные в виде строк, а затем преобразовывать, или нужно просто добавлять и преобразовывать напрямую?

Я хотел бы иметь один словарь, для которого значения являются массивами, а ключи соответствуют самому внешнему полю. Каков наилучший способ прочитать эти данные в желаемом формате?

Одно поле в .json ниже - "redshift", которое выглядит так:

"redshift": [
  {
    "value": "0.068139",
    "source": "2,4"
  }
],

Я бы хотел, чтобы мой последний набор данных был словарем, который выглядит следующим образом:

data = {

    "redshift" :

         {'value' : ["0.068139", ...],

         {'source : ["2,4", ...],

       }

Приведенный ниже код использует рекурсивный поиск в каталоге для печати содержимого каждого файла .json в каталоге.

import os
import json
import fnmatch
import numpy as np
import pandas as pd

class SuperNovaDataBase():

    def __init__(self, directory):
        super().__init__()
        self.directory = directory
        self.extension = '.json'
        self._data = dict()

    @property
    def data(self):
        return self._data

    def load_data(self):
        pattern = '*{}'.format(self.extension)
        for root, subdirectory, filenames in os.walk(self.directory):
            for filename in fnmatch.filter(filenames, pattern):
                path = os.path.join(root, filename)
                with open(path, 'r') as data_file:
                    _data = json.load(data_file)
                    print("\n{}\n".format(_data))
#
directory = '/Users/.../Desktop/SN'
SNDB = SuperNovaDataBase(directory)
SNDB.load_data()
#

Содержимое одного файла

Для примера всех данных, содержащихся в файле .json, приведенное ниже содержимое взято из первого файла .json в папке sne-2015-2019-master из каталога, указанного выше:

{
  "<a id=\"ASASSN-15og\">ASASSN-15og</a>": {
    "schema": "https://github.com/astrocatalogs/supernovae/blob/d3ef5fc/SCHEMA.md",
    "name": "<a id=\"ASASSN-15og\">ASASSN-15og</a>",
    "sources": [
      {
        "name": "2016A&A...594A..13P",
        "bibcode": "2016A&A...594A..13P",
        "reference": "Planck Collaboration et al. (2016)",
        "alias": "1"
      },
      {
        "name": "ATel 7912",
        "bibcode": "2015ATel.7912....1B",
        "reference": "Brimacombe et al. (2015)",
        "url": "http://www.astronomerstelegram.org/?read=7912",
        "alias": "2"
      },
      {
        "name": "Transient Name Server",
        "url": "https://wis-tns.weizmann.ac.il/",
        "alias": "3"
      },
      {
        "name": "Latest Supernovae",
        "secondary": true,
        "url": "http://www.rochesterastronomy.org/snimages/snredshiftall.html",
        "alias": "4"
      },
      {
        "name": "The Open Supernova Catalog",
        "bibcode": "2017ApJ...835...64G",
        "reference": "Guillochon et al. (2017)",
        "secondary": true,
        "url": "https://sne.space",
        "alias": "5"
      }
    ],
    "alias": [
      {
        "value": "<a id=\"ASASSN-15og\">ASASSN-15og</a>",
        "source": "2,4"
      },
      {
        "value": "AT2016dvr",
        "source": "2,3,4"
      }
    ],
    "claimedtype": [
      {
        "value": "Ia CSM",
        "source": "2,4"
      }
    ],
    "comovingdist": [
      {
        "value": "296.74",
        "derived": true,
        "u_value": "Mpc",
        "source": "1,2,4,5"
      }
    ],
    "dec": [
      {
        "value": "-31:18:45.6",
        "u_value": "degrees",
        "source": "2,4"
      }
    ],
    "discoverdate": [
      {
        "value": "2015/08/13",
        "source": "2,4"
      }
    ],
    "discoverer": [
      {
        "value": "ASAS-SN",
        "source": "2,4"
      }
    ],
    "lumdist": [
      {
        "value": "316.955",
        "derived": true,
        "u_value": "Mpc",
        "source": "1,2,4,5"
      }
    ],
    "maxabsmag": [
      {
        "value": "-20.6334",
        "derived": true,
        "source": "1,2,4,5"
      }
    ],
    "maxappmag": [
      {
        "value": "16.8",
        "derived": true,
        "source": "2,4,5"
      }
    ],
    "maxdate": [
      {
        "value": "2015/08/12",
        "derived": true,
        "source": "2,4,5"
      }
    ],
    "maxvisualabsmag": [
      {
        "value": "-18.215",
        "derived": true,
        "source": "1,2,4,5"
      }
    ],
    "maxvisualappmag": [
      {
        "value": "19.29",
        "derived": true,
        "source": "3,5"
      }
    ],
    "maxvisualband": [
      {
        "value": "G",
        "derived": true,
        "source": "3,5"
      }
    ],
    "maxvisualdate": [
      {
        "value": "2016/04/01",
        "derived": true,
        "source": "3,5"
      }
    ],
    "ra": [
      {
        "value": "03:21:07.44",
        "u_value": "hours",
        "source": "2,4"
      }
    ],
    "redshift": [
      {
        "value": "0.068139",
        "source": "2,4"
      }
    ],
    "velocity": [
      {
        "value": "19733",
        "u_value": "km/s",
        "source": "5"
      }
    ],
    "photometry": [
      {
        "time": "57246.5",
        "magnitude": "16.8",
        "u_time": "MJD",
        "source": "2,4"
      },
      {
        "time": "57271.4029977",
        "band": "G",
        "instrument": "Astrometric",
        "magnitude": "21.5",
        "observer": "Robot",
        "telescope": "Gaia",
        "u_time": "MJD",
        "upperlimit": true,
        "source": "3"
      },
      {
        "time": "57479.4879977",
        "band": "G",
        "e_magnitude": "0.2",
        "instrument": "Astrometric",
        "magnitude": "19.29",
        "observer": "Robot",
        "telescope": "Gaia",
        "u_time": "MJD",
        "source": "3"
      }
    ]
  }
} 
...