import: Migrate from json to ujson for better perf.

We expect to get better memory performace from
ujson than json.

We also do a better job of closing file handles.

This likely fixes #10377.
This commit is contained in:
Tim Abbott
2018-10-16 16:14:09 -07:00
parent 2eebacf2dc
commit f9b6eeb488
4 changed files with 19 additions and 15 deletions

View File

@@ -1,12 +1,11 @@
import os import os
import ujson
import dateutil.parser import dateutil.parser
import random import random
import requests import requests
import json
import logging import logging
import shutil import shutil
import subprocess import subprocess
import ujson
from django.conf import settings from django.conf import settings
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
@@ -231,7 +230,8 @@ def do_convert_data(gitter_data_file: str, output_dir: str, threads: int=6) -> N
raise Exception("Output directory should be empty!") raise Exception("Output directory should be empty!")
# Read data from the gitter file # Read data from the gitter file
gitter_data = json.load(open(gitter_data_file)) with open(gitter_data_file, "r") as fp:
gitter_data = ujson.load(fp)
realm, avatar_list, user_map = gitter_workspace_to_realm( realm, avatar_list, user_map = gitter_workspace_to_realm(
domain_name, gitter_data, realm_subdomain) domain_name, gitter_data, realm_subdomain)

View File

@@ -1,11 +1,11 @@
import base64 import base64
import dateutil import dateutil
import glob import glob
import json
import logging import logging
import os import os
import shutil import shutil
import subprocess import subprocess
import ujson
from typing import Any, Callable, Dict, List, Set from typing import Any, Callable, Dict, List, Set
@@ -82,8 +82,8 @@ def untar_input_file(tar_file: str) -> str:
def read_user_data(data_dir: str) -> List[ZerverFieldsT]: def read_user_data(data_dir: str) -> List[ZerverFieldsT]:
fn = 'users.json' fn = 'users.json'
data_file = os.path.join(data_dir, fn) data_file = os.path.join(data_dir, fn)
data = json.load(open(data_file)) with open(data_file, "r") as fp:
return data return ujson.load(fp)
def convert_user_data(user_handler: UserHandler, def convert_user_data(user_handler: UserHandler,
raw_data: List[ZerverFieldsT], raw_data: List[ZerverFieldsT],
@@ -184,7 +184,8 @@ def convert_avatar_data(avatar_folder: str,
def read_room_data(data_dir: str) -> List[ZerverFieldsT]: def read_room_data(data_dir: str) -> List[ZerverFieldsT]:
fn = 'rooms.json' fn = 'rooms.json'
data_file = os.path.join(data_dir, fn) data_file = os.path.join(data_dir, fn)
data = json.load(open(data_file)) with open(data_file) as f:
data = ujson.load(f)
return data return data
def convert_room_data(raw_data: List[ZerverFieldsT], realm_id: int) -> List[ZerverFieldsT]: def convert_room_data(raw_data: List[ZerverFieldsT], realm_id: int) -> List[ZerverFieldsT]:
@@ -296,7 +297,8 @@ def write_emoticon_data(realm_id: int,
fn = 'emoticons.json' fn = 'emoticons.json'
data_file = os.path.join(data_dir, fn) data_file = os.path.join(data_dir, fn)
data = json.load(open(data_file)) with open(data_file) as f:
data = ujson.load(f)
flat_data = [ flat_data = [
dict( dict(
@@ -431,7 +433,8 @@ def process_message_file(realm_id: int,
attachment_handler: AttachmentHandler) -> None: attachment_handler: AttachmentHandler) -> None:
def get_raw_messages(fn: str) -> List[ZerverFieldsT]: def get_raw_messages(fn: str) -> List[ZerverFieldsT]:
data = json.load(open(fn)) with open(fn) as f:
data = ujson.load(f)
flat_data = [ flat_data = [
d[message_key] d[message_key]

View File

@@ -1,9 +1,9 @@
import json
import random import random
import requests import requests
import shutil import shutil
import logging import logging
import os import os
import ujson
from typing import List, Dict, Any, Optional, Set from typing import List, Dict, Any, Optional, Set
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
@@ -509,4 +509,5 @@ def process_emojis(zerver_realmemoji: List[ZerverFieldsT], emoji_dir: str,
def create_converted_data_files(data: Any, output_dir: str, file_path: str) -> None: def create_converted_data_files(data: Any, output_dir: str, file_path: str) -> None:
output_file = output_dir + file_path output_file = output_dir + file_path
os.makedirs(os.path.dirname(output_file), exist_ok=True) os.makedirs(os.path.dirname(output_file), exist_ok=True)
json.dump(data, open(output_file, 'w'), indent=4) with open(output_file, 'w') as fp:
ujson.dump(data, fp, indent=4)

View File

@@ -1,5 +1,4 @@
import os import os
import json
import ujson import ujson
import hashlib import hashlib
import sys import sys
@@ -569,7 +568,7 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
message['text'], users, added_channels, added_users) message['text'], users, added_channels, added_users)
except Exception: except Exception:
print("Slack message unexpectedly missing text representation:") print("Slack message unexpectedly missing text representation:")
print(json.dumps(message, indent=4)) print(ujson.dumps(message, indent=4))
continue continue
rendered_content = None rendered_content = None
@@ -793,7 +792,8 @@ def do_convert_data(slack_zip_file: str, output_dir: str, token: str, threads: i
logging.info("Zulip data dump created at %s" % (output_dir)) logging.info("Zulip data dump created at %s" % (output_dir))
def get_data_file(path: str) -> Any: def get_data_file(path: str) -> Any:
data = json.load(open(path)) with open(path, "r") as fp:
data = ujson.load(fp)
return data return data
def get_slack_api_data(token: str, slack_api_url: str, get_param: str) -> Any: def get_slack_api_data(token: str, slack_api_url: str, get_param: str) -> Any: