python - 生成数百万个json数据

标签 python json out-of-memory pypy faker

我需要一些 json 格式的虚拟数据,以便在另一个项目中使用。我目前在下面的代码中使用 Faker 包:

from json import dumps
from faker import Faker
import collections

database = []
filename = '1M'
length   = 1000000
fake     = Faker() # <--- Forgot this

for x in range(length):
    database.append(collections.OrderedDict([
        ('last_name', fake.last_name()),
        ('first_name', fake.first_name()),
        ('street_address', fake.street_address()),
        ('email', fake.email())
    ]))

with open('%s.json' % filename, 'w') as output:
    output.write(dumps(database, indent=4))
print "Done."

这段代码可以工作,但是速度很慢。我尝试了 PyPy,结果令我震惊。我目前能够在大约 600 秒内生成一个包含 100 万条数据的 json 文件,大约 220mb。问题是,当我尝试更进一步时,例如 200 万个数据,我希望它在大约 1200 秒内完成,脚本运行超出了这个时间,我遇到了这个异常 MemoryError 没有解释为什么会发生这种情况,我相信它与 PYPY_GC_MAX 有关,但同样,2M 文件的重量应该约为 440mb。

在尝试解决此问题时,我仍在寻找一种方法来进一步压缩生成时间。我尝试过列表理解,map(),结果与 for 循环相同。

谢谢

最佳答案

您不需要使用OrderedDict:JSON 格式可能不会(也不会)保存项目的顺序。即使顺序将保存在文件中 - 当另一个项目解析该文件时它也会中断。

您只需要使用dict。而且速度也会快得多。

要保存项目的顺序,您应该显式保留每个元素的索引。像这样:

from json import dumps
from faker import Faker
import collections
import json

def fake_person_generator(length, fake):
    for x in range(length):  # xrange in Python 2.7
        yield {'last_name': fake.last_name(),
               'first_name': fake.first_name(),
               'street_address': fake.street_address(),
               'email': fake.email(),
               'index': x}

database = []
filename = '1M'
length   = 1000000
fake     = Faker() # <--- Forgot this
fpg = fake_person_generator(length, fake)
with open('%s.json' % filename, 'w') as output:
    output.write('[')  # to made json file valid according to JSON format
    for person in fpg:
        json.dump(person, output)
    output.write(']')  # to made json file valid according to JSON format
print "Done."

关于python - 生成数百万个json数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963864/

相关文章:

python - Sklearn 将 fit() 参数传递给管道中的 xgboost

jquery - 部分 View 与 Json(或两者)

java - JNI 全局引用持有的 JPanel 导致 OOM 异常

linux - 在 "OOM Killer"之后,有没有 "Resurrector"?

python - 进程数增加时多处理挂起

python - 模拟接受 **kwargs 的函数

python - 程序如何在python中的两个函数之间进行选择?

java - 将 JSON 作为 HTTP POST 参数发送 (Android/Java)

json - 将 go 结构嵌入到 gorm 中的另一个结构中

c# - .net winform treeview 内存不足异常