我还将使用一个单独的线程来进行文件写入,并用于Queue
记录所有实体。刚开始的时候,我以为这会在 5 分钟内完成,但后来发现有点困难。simplejson
和我知道的所有其他此类库不支持部分写入,因此您不能先编写列表的一个元素,然后再添加另一个等。因此,我尝试手动解决此问题,方法是[
分别写入文件,
和]
然后分别倾倒每个实体。
如果无法检查它(因为我没有你的 api),你可以尝试:
import threading
import Queue
import simplejson
from apiWrapper import api
from entities import listEntities #list of the 200,000 entities
CHUNK_SIZE = 1000
class EntityWriter(threading.Thread):
lines_written = False
_filename = "fullEntities.txt"
def __init__(self, queue):
super(EntityWriter, self).__init()
self._q = queue
self.running = False
def run(self):
self.running = True
with open(self._filename,"a") as f:
while True:
try:
entity = self._q.get(block=False)
if not EntityWriter.lines_written:
EntityWriter.lines_written = True
f.write("[")
simplejson.dump(entity,f)
else:
f.write(",\n")
simplejson.dump(entity,f)
except Queue.Empty:
break
self.running = False
def finish_file(self):
with open(self._filename,"a") as f:
f.write("]")
a=api()
fullEntityQueue=Queue.Queue(2*CHUNK_SIZE)
n_entities = len(listEntities)
writer = None
for i, entity in listEntities:
fullEntityQueue.append(a.getFullEntity(entity))
if (i+1) % CHUNK_SIZE == 0 or i == n_entities-1:
if writer is None or not writer.running:
writer = EntityWriter(fullEntityQueue)
writer.start()
writer.join()
writer.finish_file()
这个脚本的作用
主循环仍然遍历您的实体列表,获取每个实体的完整信息。之后,每个实体现在都被放入一个队列中。每 1000 个实体(在列表的末尾),就会启动一个与主线程并行运行的 EntityWriter-Thread。此 EntityWriterget
来自Queue
并将其转储到所需的输出文件。
需要一些额外的逻辑来使 JSON 成为一个列表,如上所述,我是手动编写[
的。原则上,当你重新加载它时,结果文件应该被理解。,
]
simplejson