سؤال

أريد نسخ المحتوى من كائن واحد مخزن في DOCBASE إلى كائن آخر مخزن في Docbase آخر. لا أريد إنشاء ملف لأن لدي أكثر من 300 ملف على ملفات النسخ. أدناه جزء من الرمز الخاص بي:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

IOUtils.copy(source.getContent(), baos);

[...]
targetObj.setContent(baos); // Documentum DFC
targetObj.save(); // Documentum DFC

اذا انا لا تتنزه JVM، IOUtils.copy(source.getContent(), baos); اعطي java.lang.OutOfMemoryError: Java heap space.

إذا قمت بضبط JVM عن طريق إعداد قيمة XMX MAX، فإن التعليمات السابقة على ما يرام، ولكن java.lang.OutOfMemoryError: Java heap space يحدث مع targetObj.setContent(baos);.

مع 8332175 فقط بايت محتوى كبير ... (7.94 ميغابايت)

أي فكرة ما هو الخطأ؟ طريقة أفضل للنسخ من bytearrayinputstream إلى bytearrayoutputstream؟ شيء آخر؟


بعض الوثائق API.

الحصول على المحتوى

Public BytearrayInputstream GetContent () يلقي DFException

نسخ محتوى هذا الكائن من خادم المستندات إلى كائن bytearrayinputstream.

يوضح مثال التعليمات البرمجية التالي كيفية نسخ محتوى كائنات من خادم المستندات في الذاكرة:

    IDfSysObject sysObj = (IDfSysObject)session.getObject(new DfId("0900d5bb8001f900"));
    ByteArrayInputStream bais = sysObj.getContent();
    if (bais.available() > 0)
    {
         // Data successfully fetched from the server...
    }

إرجاع: كائن bytearrayinputstream يحتوي على محتوى الكائنات. رميات: DFException - إذا حدث خطأ في الخادم.

و

SETContent.

SETContent Public Boolean (محتوى Bytearrayoutputstream) يلقي DFException

يحدد محتوى جديد لكائن. استخدم هذه الطريقة عند الرغبة في تعيين البيانات الموجودة> في ذاكرة العمل.

يوضح المثال التعليمات البرمجية التالي كيفية تعيين المحتوى المقيم في الذاكرة إلى مستند جديد:

    IDfSysObject sysObj = (IDfSysObject)sess.newObject("dm_document");
    sysObj.setObjectName("testDoc");
    sysObj.setContentType("crtext");
    byte b[] = {35,36,37,38,39};
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    out.write(b, 0, 5);
    sysObj.setContent(out);
    sysObj.save();

المعلمات: المحتوى - المحتوى باعتباره bytearrayoutputstream. رميات: DFException - إذا حدث خطأ في الخادم.

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

المحلول

طالما كنت تستخدم ByteArrayOutputStream, ، ستضطر البيانات لتناسب الذاكرة.

أنا لا أعرف شيئا عن الوثائق، ولكن هل هناك ربما targetObj.setContent(File) أو setContent(InputStream), ، بحيث يمكنك تجنب قراءة الجزء كله في byte[]?

(8 ميغابايت ليس كل ما هكذا، ربما يمكنك فقط ضبط مساحة كومة Java. يمكن أن يساعد أيضا في حجم المخزن المؤقت المستخدمة من قبل BAOS، يمكنك تمرير الحجم الأولي إلى منشئته)

تحديث: هل أنت متأكد من العائد يأخذ bytearray انتاج | مجرى؟ عادة، سيقرأ STERTER من Inputstream.

نصائح أخرى

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

   IDfClientEx clientx = new DfClientEx();
   IDfExportOperation exOp = clientx.getExportOperation();
   IDfSysObject exportObj = getObjectToExport();
   IDfExportNode = (IDfExportNode) exOp.add(exportObj);
   exOp.execute();
   String path = exOp.getFilePath();

   IDfImportOperation impOper = clientx.getImportOperation();
   IDfFile dfFile = new DfFile(path);
   IDfImportNode impNode = (IDfImportNode) impOper.add(dfFile);
   impNode.setDocbaseObjectType("dm_document");
   impNode.setDestinationFolderId(importFolderId);
   impNode.setNewObjectName("testDoc");
   impNode.setFormat("crtext");
   impOper.setKeepLocalFile(false);
   impOper.execute();

إذا كنت بحاجة إلى تخزين هذا مؤقتا في الذاكرة، فقم بزيادة حجم ذاكرة JVM Max الخاص بك باستخدام:

java -Xmx256m

لزيادة الحد الأقصى لتخصيص الذاكرة إلى 256 ميغابايت (الافتراضي هو 64 ميجابايت). يرى هنا لمزيد من التفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top