Я использую Pandas для получения около 2 миллионов записей из API, который возвращает объект JSON. API имеет предел возврата только 5000 объектов JSON за раз, поэтому я перебираю вызовы API, чтобы получить JSON. Вот шаги, которые я выполняю: 1. Получить все record_ids в списке. 2. Создайте вызовы API (URL-адреса), разбив record_ids на куски по 5000 каждый. 3. Перейдите по созданным URL-адресам, чтобы получить JSON. 4. Создайте список JSON, которые были получены выше. 5. Используйте pd.io.json.json_normalize для создания фрейма данных.
Проблема заключается в том, что у меня не хватает памяти, если я превышаю определенный лимит записей для извлечения. Я пытаюсь использовать DASK, чтобы помочь с проблемой памяти. Однако я не могу понять, как использовать пакеты DASK для выполнения функций, аналогичных спискам (например, «Добавить»). Или, как мне добавить больше JSON, возвращаемых итеративными вызовами API, в тот же пакет DASK?
Это код, который я использую, и он отлично работает для небольших наборов данных:
import pandas as pd
import json
import requests
import getpass
# Specify the date range and system for which the recordIDs need to be fetched
recordIDsURL = 'http://example.com:8071/records/getIds?system=ABC&daterange=2019-01-15,2019-10-15'
# Specify the record service API which returns the record info for provided record ids
recordServiceURL = 'http://example:8071/records/'
# Get the recordIds for the provided date range and system
request = requests.get(recordIDsURL, auth = requests.auth.HTTPBasicAuth(username, password))
# Put the recordIds into a list
listid = request.json()
# Divide the recordIDs into smaller lists containing 5000 recordIDs
listChunks = [listid[x:x+5000] for x in range(0, len(listid), 5000)]
# Make a list for disctinct URLs for calling the API
url = [0 for i in range(len(listChunks))]
# Make a list for storing the result of the URL calls
recordRequest = [0 for i in range(len(listChunks))]
# Make a list for converting the result of the URL calls into a list of JSONs
jsonList = [0 for i in range(len(listChunks))]
# Iterate over the URL calls
for i in range(len(listChunks)):
url[i] = recordServiceURL + (','.join(listChunks[i]))
recordRequest[i] = requests.get(url[i], auth = requests.auth.HTTPBasicAuth(username, password))
jsonList[i] = recordRequest[i].json()
# Merge the JSON list into a single JSON to load into DF
mergeJson = []
for i in jsonList:
mergeJson += i
df = pd.io.json.json_normalize(mergeJson)
На листе орехов я надеюсь использовать пакеты DASK и фрейм данных DASK вместо списка питонов и фрейма данных pandas в приведенном выше коде.