Objectify Appengine के साथ बड़े ब्लॉब भंडारण

मेरे पास यह वर्ग है जिसे मैं ऑब्जेक्टिफ़ाई का उपयोग करना जारी रखना चाहता हूं, यह कक्षा 1 एमबी से बड़े डेटा का प्रतिनिधित्व करेगी, इसलिए ब्लॉब ऑब्जेक्ट्स की एक सूची है जो बाइट सरणी के एक टुकड़े का प्रतिनिधित्व करती है जो आकार में 1 एमबी से कम है:

@Entity
public class BigBlob {

    @Id
    private Long id;
    public static final int FRAGMENT_LIMIT = 777 * 1024;
    @Serialized
    private List fragments = new ArrayList();

    ...

}

फिर भी, "टुकड़े" @ Serialized है, जो इस बिगब्लोब वर्ग/वस्तु के आकार को 1 एमबी से बड़ा प्रस्तुत करेगा।

इस त्रुटि के कारण:

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large.

अगर मैं @ एम्बेडेड एनोटेशन का उपयोग करता हूं तो मुझे यह त्रुटि मिलती है:

Cannot place array or collection properties inside @Embedded arrays or collections

मैं कैसे सुनिश्चित करूं कि "टुकड़े" को एक अलग इकाई के रूप में संग्रहीत किया जाता है?

बीटीडब्ल्यू, मेरे पास पहले से ही बाइट चंकिंग तर्क है जो पूरे बाइट सरणी को चॉप करता है और टुकड़ों को सूची Blob में डाल देता है, इसलिए यह प्रश्न बाइट्स को काटने के तरीके से संबंधित नहीं है ।

अधिकांशतः जो मैं जानना चाहता हूं वह लगातार पक्ष पर अधिक है।

5
जोड़ा संपादित
विचारों: 2

2 उत्तर

आपको इसे ब्लॉबस्टोर में स्टोर करना चाहिए और ऑब्जेक्टिफ़ाई में ब्लॉबी को सेव करना चाहिए। डेटास्टोर के शीर्ष पर काम करता है, ब्लॉबस्टोर नहीं।

4
जोड़ा

रिक का जवाब वास्तव में ब्लॉबस्टोर में सबसे अच्छा स्टोर ब्लॉब्स है, खासकर यदि आप जीएई के लिए नए हैं और डेटास्टोर के साथ वैचारिक मुद्दे हैं।

दूसरी तरफ, ब्लॉब्स स्टोर करने के लिए स्प्लिट इकाइयों का उपयोग करने के कुछ अच्छे कारण हैं, खासकर यदि आप 1 एम एज के करीब डेटा संग्रहीत कर रहे हैं। आप 100 एमबी ब्लब्स के साथ ऐसा नहीं करना चाहते हैं, लेकिन 2 एमबी ब्लब्स समझ में आ सकते हैं।

सबसे पहले, आप serialized या एम्बेडेड नहीं चाहते हैं। वे एक इकाई के अंदर डेटा संरचना करने के लिए बस तरीके हैं।

इसके अलावा, कोई जादू एनोटेशन नहीं है जो आपको इकाइयों में ब्लब्स को विभाजित करने देता है। आपको इसे सब हाथ से करना है। आपको वास्तव में 'मास्टर' या मूल इकाई बनाने की आवश्यकता नहीं है; बस एक आईडी (लेकिन कोई वास्तविक इकाई) द्वारा परिभाषित अभिभावक के साथ सभी इकाई टुकड़े बनाएं और सभी टुकड़ों को लाने के लिए पूर्वजों() क्वेरी का उपयोग करें।

2
जोड़ा
@stickfigure का मतलब है, जब मैं AppengineFile लिखता हूं तो फ़ाइल सेवा एपीआई वास्तव में फ़ाइलों को अपलोड करता है? मेरे मामले में मैंने फाइल सेवा एपीआई का उपयोग करके बाइट्स का उपयोग करके ऑब्जेक्टिफा और स्टोर के साथ मेटाडेटा स्टोर किया था
जोड़ा लेखक xybrek, स्रोत
आप निश्चित रूप से कर सकते हैं, लेकिन ब्लॉबस्टोर से संबंधित एपीआई के साथ काम करने के लिए दर्द होता है और अन्य डेटास्टोर काम के साथ आसानी से लेनदेन नहीं किया जा सकता है। कभी-कभी कई-इकाई हैक के साथ भी डेटास्टोर का उपयोग करना काफी आसान होता है। दूसरी ओर, ब्लॉस्टस्टोर स्टोरेज डाटास्टोर स्टोरेज से सस्ता है, इसलिए इस विकल्प को बेकार ढंग से नहीं बनाया जाना चाहिए।
जोड़ा लेखक stickfigure, स्रोत
Put() ing की सादगी की तुलना में या किसी इकाई को प्राप्त करें() फ़ाइलें, एपीआई एक monstrosity है, और सामान्य ब्लॉब अपलोड यूआरएल का उपयोग प्रोग्राम तर्क के लिए अत्यधिक आक्रामक है। लेनदेन के संबंध में - क्यों नहीं होगा आप ब्लॉबस्टोर और डेटास्टोर का विस्तार करने वाले लेनदेन चाहते हैं? मैं अक्सर उस ब्लॉब के लिए एक ब्लॉब और कुछ अतिरिक्त मेटाडेटा लिखता हूं। ऑपरेशन को लेनदेन-आश होना चाहिए, मुझे कुछ महत्वपूर्ण हुप्स से गुजरना है।
जोड़ा लेखक stickfigure, स्रोत
सभी फाइलों और चैनलों और ताले और पाठकों और लेखकों के साथ, जावा फाइल एपीआई अतिरंजित महसूस करता है। पायथन फाइल एपीआई एक ही समस्या का सामना नहीं कर रहा है, और यह भाषा मतभेदों द्वारा समझाया नहीं गया है। जबकि आपको अभी भी बहु-इकाई ब्लॉब्स करने के लिए कुछ बॉयलरप्लेट की आवश्यकता है, यह डेटास्टोर एपीआई से पहले से परिचित किसी के लिए एक छोटी राशि और अंतर्ज्ञानी है। लेकिन वास्तव में, बहु-इकाई ब्लॉब्स के लिए मुख्य तर्क आपके आवेदन के लेनदेन संबंधी तर्क के साथ एकीकृत करने में सक्षम है।
जोड़ा लेखक stickfigure, स्रोत
"दूसरी ओर, वहाँ, भंडारण धब्बे के लिए विभाजन संस्थाओं उपयोग करने के लिए कुछ अच्छे कारण हैं खासकर यदि आप डेटा कि 1M किनारे के करीब है भंडारण कर रहे हैं" - वास्तव में, वहाँ कोई कारण नहीं तुम धब्बे 1MB से कम में संग्रहीत नहीं कर सकता है नहीं ब्लॉबस्टोर भी।
जोड़ा लेखक Nick Johnson, स्रोत
ब्लॉबस्टोर एपीआई के बारे में क्या काम करना मुश्किल है? और आपको एक लेनदेन की आवश्यकता क्यों है जो ब्लॉबस्टोर और डेटास्टोर को फैलाता है?
जोड़ा लेखक Nick Johnson, स्रोत
मुझे नहीं पता कि यह 'monstrosity' के रूप में योग्य क्यों है - यह मेरी राय में, इसे करने के लिए जितना आसान हो सकता है, उतना आसान है। और तुलना एक ही पॉट के लिए नहीं है - यह कई इकाइयों में एक ब्लॉब संपत्ति फैलाने के लिए आपको जो भी बुनियादी ढांचा बनाना है, वह है!
जोड़ा लेखक Nick Johnson, स्रोत
यदि आपके पास कई (लाख) छोटे ब्लब्स हैं तो Google संग्रहण थोक संचालन (उदा। संग्रह) के साथ धीमा है। फिर डेटास्टोर और स्प्लिट ब्लब्स का उपयोग करना बेहतर हो सकता है जो 1 एमबी से अधिक हो।
जोड़ा लेखक xmedeko, स्रोत
अभी भी 10 एमबी प्रति क्वेरी सीमित है, इसलिए यदि आप 10 एमबी से अधिक फाइल विभाजित करते हैं तो आप इसे एक प्रश्न से नहीं प्राप्त कर सकते हैं।
जोड़ा लेखक xmedeko, स्रोत