我需要一些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循环相同。

谢谢

最佳答案

之所以会内存不足,是因为首先要生成整个数据库,然后再转储数据库。一种更便于记忆的方式是即时生成dict条目。更好的方法是使用generator即时输入条目。

def fake_person_generator(length):
    for x in range(length):  # xrange in Python 2.7
        yield OrderedDict([
            ('last_name', 'lastname_%i' % x),
            ('first_name', 'firstname_%i' % x),
            ('street_address', 'adress_%i' % x),
            ('email', 'email_%i' % x)])


结合Alex Hall的答案,这将大大减少内存需求。

我不太了解json-module,但是写起来是这样的:

length = 1000000
fpg = fake_person_generator(length)
with open('%s.json' % filename, 'w') as output:
    for person in fpg:
        json.dump(person, output)
print "Done."

10-08 05:41
查看更多