我需要一些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."