إلحاق JSON في بيثون (على النحو الأمثل بسبب قيود ذاكرة الوصول العشوائي)

StackOverflow https://stackoverflow.com/questions/4602262

سؤال

أحاول العثور على الطريقة المثلى لإلحاق بعض البيانات بملف JSON باستخدام Python. في الأساس ما يحدث هو أن أقول 100 سلسلة من المواضيع المفتوحة تخزين البيانات إلى صفيف. عند الانتهاء ، يرسلون ذلك إلى ملف JSON باستخدام json.dump. ومع ذلك ، نظرًا لأن هذا قد يستغرق بضع ساعات حتى يستغرق الأمر أن ينتهي الأمر في نهاية المطاف. لذلك أحاول أن أرى ما هي أفضل طريقة لاستخدام أقل كمية من ذاكرة الوصول العشوائي في هذه العملية. ما يلي هو ما لدي الذي يستهلك الكثير من ذاكرة الوصول العشوائي.

        i               = 0
        twitter_data    = {}
        for null in range(0,1):
            while True:
                try:
                    for friends in Cursor(api.followers_ids,screen_name=self.ip).items():
                        twitter_data[i]                     = {}
                        twitter_data[i]['fu']               = self.ip
                        twitter_data[i]['su']               = friends
                        i = i + 1
                except tweepy.TweepError, e:
                    print "ERROR on " + str(self.ip) + " Reason: ", e
                    with open('C:/Twitter/errors.txt', mode='a') as a_file:
                        new_ii = "ERROR on " + str(self.ip) + " Reason: " + str(e) + "\n"
                        a_file.write(new_ii)
                break

        ## Save data

        with open('C:/Twitter/user_' + str(self.id) + '.json', mode='w') as f:
                json.dump(twitter_data, f, indent=2, encoding='utf-8')

شكرًا

هل كانت مفيدة؟

المحلول

رأيي ، البناء على الفكرة من إجابة غلين ، ولكن تسلسل التقليل الكبير حسب طلب البروتوكول الاختياري واستخدام المزيد من البيثوني enumerate بدلا من زيادة يدويا i (يمكن أخذ الأخطاء في الاعتبار عن طريق الاحتفاظ بعد منفصل لهم وطرحه من i قبل أن ينطق f):

with open('C:/Twitter/user_' + str(self.id) + '.json', mode='w') as f:
   f.write('{')
   for i, friends in enumerate(Cursor(api.followers_ids,screen_name=self.ip).items()):
        if i>0:
            f.write(", ")
        f.write("%s:%s" % (json.dumps(i), json.dumps(dict(fu=self.ip, su=friends))))
   f.write("}")

نصائح أخرى

إخراج العناصر الفردية كصفيف عند إنشائها ، مما يخلق تنسيق JSON للمصفوفة المحيطة بها يدويًا. JSON هو تنسيق بسيط ، لذلك هذا تافهة للقيام به.

إليك مثال بسيط يطبع مجموعة JSON ، دون الحاجة إلى الاحتفاظ بالمحتويات بأكملها في الذاكرة ؛ يجب تخزين عنصر واحد فقط في الصفيف مرة واحدة.

def get_item():
    return { "a": 5, "b": 10 }

def get_array():
    results = []
    yield "["
    for x in xrange(5):
        if x > 0:
            yield ","
        yield json.dumps(get_item())
    yield "]"

if __name__ == "__main__":
    for s in get_array():
        sys.stdout.write(s)
    sys.stdout.write("\n")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top