জাভাতে "কোড খুব বড়" সংকলন ত্রুটি


94

জাভাতে কোডের জন্য কোনও সর্বাধিক আকার রয়েছে? আমি 10,000 টিরও বেশি লাইনের সাথে একটি ফাংশন লিখেছি। আসলে, প্রতিটি লাইন একটি অ্যারে ভেরিয়েবলের জন্য একটি মান নির্ধারণ করে।

arts_bag[10792]="newyorkartworld";
arts_bag[10793]="leningradschool";
arts_bag[10794]="mailart";
arts_bag[10795]="artspan";
arts_bag[10796]="watercolor";
arts_bag[10797]="sculptures";
arts_bag[10798]="stonesculpture"; 

এবং সংকলনের সময়, আমি এই ত্রুটিটি পেয়েছি: কোডটি খুব বড়

আমি কীভাবে এটিকে কাটিয়ে উঠতে পারি?


9
আমি কেবল হতবাক ... এটি করার আরও ভাল উপায় হতে বাধ্য।
থানোস পাপাথানসিয়ো

7
এই ধরণের জিনিসটির জন্য আপনাকে সত্যই কোনও ডাটাবেসটি দেখতে হবে, কোনও সম্পত্তি ফাইল ব্যর্থ করে।
পল হিলান

45
ছেলেরা খারাপ ডিজাইনের জন্য দরিদ্র লোকটির দিকে কেন চিৎকার করছে? হয়তো ওপি কিছু কোড জেনারেশন সরঞ্জাম দ্বারা সেই উন্মাদ পদ্ধতিটি পেয়েছিল।
ওয়েবস্টার

15
আমি স্তম্ভিত হয়েছি যে এই অগভীর সমালোচনামূলক মন্তব্যগুলি এতগুলি উত্সাহ পেয়েছে!
এভেজেনি সার্জিভ

7
আপনি যখন সংকলন সংকলনের সময় সমস্ত কিছু প্রাক-জেনারেটর করতে পারেন তখন কেন আপনার অ্যাপ্লিকেশন স্টার্টআপটি কিছু পাঠ্য ফাইলকে পার্স করে অনেক সময় ব্যয় করেছে? আপনি যদি পুনরায় সংশোধন না করে ডেটা পরিবর্তন করতে চান বা নিজে নিজে পদ্ধতিটি লিখতে চান তবে এটি খারাপ নকশা but তবে আপনি যদি উত্স কোডটি উত্পন্ন করেন তবে এটি কোনও খারাপ নকশা নয়। (কমপক্ষে যদি আপনি এটি এমনভাবে করেন যা আসলে সংকলকটিকে অ্যারে প্রেজেনেট করতে দেয়)।
গুনট্রাম ব্লহম

উত্তর:


93

জাভা ক্লাসে একটি পদ্ধতিতে বাইটকোডের সর্বাধিক K৪ কেবি হতে পারে।

তবে আপনার এটি পরিষ্কার করা উচিত!

.propertiesএই ডেটা সংরক্ষণ করার জন্য ফাইল ব্যবহার করুন এবং এর মাধ্যমে লোড করুনjava.util.Properties

আপনি .propertiesআপনার ক্লাসপথে ফাইল রেখে এটি করতে পারেন এবং ব্যবহার করুন:

Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);

4
"আপনার জেডিকে / জেভিএমের আসল আকারটি কী তা বিবেচনাধীন নয়"? আপনি কি বোঝাচ্ছেন যে এই সীমাটি স্থির নয়? কারণ এটি ক্লাস ফাইল ফর্ম্যাট স্পেসিফিকেশন দ্বারা স্থির এবং প্রয়োজনীয়।
জোছিম সউর

4
আমি .properties ফাইলটি কোথায় পেতে পারি
ট্রিনিটি

4
আপনি নিজের তৈরি করে তারপর ক্লাসপথে রেখে দিন
মার্ক

4
আমি আপনার পরামর্শটি ব্যবহার করতে পারি নি, যদিও আমি পরের বার চেষ্টা করার জন্য আগ্রহী .. এখন এই তথ্য সংরক্ষণ করার জন্য একটি ডাটাবেস ব্যবহার করেছি, এবং সেই অনুযায়ী বাকি কোডটি সংশোধন করেছি ...
ট্রিনিটি

4
আমি যদি এটি একটি বোকা প্রশ্ন হয় তবে আমি দুঃখিত, তবে .. এই .properties ফাইলটি কোথায় রাখা উচিত? মানে, ঠিক আছে, এটি ক্লাসপথে আছে, তবে এটি কোথায়?
মিলাক 27

14

একটি পদ্ধতিতে একটি 64K বাইট-কোড আকার সীমা রয়েছে

এই কথাটি বলে, আমাকে ডাব্লু / রিচার্ডকে সম্মত করতে হবে; আপনার এত বড় একটি পদ্ধতি দরকার কেন? ওপিতে উদাহরণস্বরূপ, একটি সম্পত্তি ফাইলের যথেষ্ট হওয়া উচিত ... বা প্রয়োজনে ডাটাবেসও।


4
enums সম্পর্কে কি? আমি বড় আকারের এনামগুলিতে একই সমস্যাটি পাই
টবি

4
@ টবি: আমি নিজেই এনামের সাথে এই সমস্যার মুখোমুখি হইনি। একই সমস্যা সম্পর্কে যদিও এসওতে এখানে অন্য ব্যবহারকারীদের পোস্ট রয়েছে। উদাহরণস্বরূপ - stackoverflow.com/questions/2546470 এটি একটি জন্য উত্পন্ন .class ফাইলে দেখুন উপযুক্ত হতে পারে enumদেখতে
সবাই

এনাম উদাহরণস্বরূপ (অর্থাত্ স্থির প্রতিনিধিত্বকারী অবজেক্টগুলি) ক্লাসে তৈরি করা হয় 'স্ট্যাটিক ইনিশিয়ালাইজার, যা একটি পদ্ধতি এবং একই সীমাবদ্ধতা রয়েছে।
জুয়ানকন

আমি সত্যই জটিল ওয়েব ফর্মের জন্য ফ্রেমওয়ার্ক-উত্পন্ন কোডের সাথে একই সমস্যার মুখোমুখি হয়েছি। সমাধানটি ছিল উপাদানগুলিতে ফর্মটি বিভক্ত করা, সুতরাং প্রতিটি উপাদানগুলির জন্য উত্পন্ন কোডটিও বিভক্ত হয়েছিল।
সেবাগ্রা

13

মতে জাভা ভার্চুয়াল মেশিন স্পেসিফিকেশন , একটি পদ্ধতি কোড চেয়ে বড় 65536 বাইট রাখা যাবে না :

code_lengthআইটেমটির মান codeএই পদ্ধতির জন্য অ্যারেতে বাইট সংখ্যা দেয় ।

কোড_ দৈর্ঘ্যের মান অবশ্যই শূন্যের চেয়ে বেশি হতে হবে (কোড অ্যারেটি খালি হওয়া উচিত নয়) এবং 65536 এর চেয়ে কম।

code_lengthcode[]বৈশিষ্ট্যের আকার নির্ধারণ করে যা কোনও পদ্ধতির আসল বাইকোড ধারণ করে:

codeঅ্যারের পদ্ধতি বাস্তবায়ন জাভা ভার্চুয়াল মেশিন কোড প্রকৃত বাইট দেয়।


7

এটাকে কিছুটা উন্মাদ বলে মনে হচ্ছে। আপনি কি কোনও পাঠ্য ফাইল, বা অন্য কোনও ডেটা উত্স থেকে মানগুলি পড়ে অ্যারেটিকে আরম্ভ করতে পারবেন না?


4
(কারণ Downvoted) অন্তত এক কারণে এ এই চাহিদা কেন এমন একটি কৌশল খারাপ। কোনও ভাল কারণ নিয়ে আসা সহজ নয়।
এভেজেনি সার্জিভ

3

এই ত্রুটিটি কখনও কখনও একক ফাংশনে খুব বেশি সংখ্যক কোডের কারণে ঘটে ... সেই ত্রুটিটি সমাধান করতে, সেই ফাংশনটিকে একাধিক ফাংশনে ভাগ করুন, যেমন

//Too large code function
private void mySingleFunction(){
.
.
2000 lines of code
}
//To solve the problem
private void mySingleFunction_1(){
.
.
500 lines of code
}
private void mySingleFunction_2(){
.
.
500 lines of code
}
private void mySingleFunction_3(){
.
.
500 lines of code
}
private void mySingleFunction_4(){
.
.
500 lines of code
}
private void MySingleFunction(){
mySingleFunction_1();
mySingleFunction_2();
mySingleFunction_3();
mySingleFunction_4();
}

2

আপনার কোডটি রিফ্যাক্টর করার চেষ্টা করুন। জাভাতে পদ্ধতির আকারের সীমা রয়েছে।


4
রিফ্যাক্টরিং যুক্তিসঙ্গত ধারণা হিসাবে বাঁধে না যদি সে পদ্ধতিতে সে যা করে তা অ্যারে ইনিশিয়েশন হয়।
গ্যাব্রিয়েল áerbák

4
তিনি বলেছিলেন যে তাঁর বাকী কোডটি এটি অ্যারে হওয়ার উপর নির্ভর করে। সুতরাং তিনি ফাইলটি / ডাটাবেস থেকে অন্য কোনও পদ্ধতি / কারখানায় ডেটা লোড করার দায়িত্বটি পাস করার পদ্ধতিটি রিফ্যাক্টর করতে পারেন।
পদ্মরাগ

আপনি এই ধরণের বাজে কথা অবলম্বন না করে বড় অ্যারেগুলি তৈরি এবং সূচনা করতে পারেন; @ ক্রিসের উত্তর দেখুন।
স্টিফেন সি

রিফ্যাক্টর - "সফ্টওয়্যারটির কিছু অযৌক্তিক গুণাবলী উন্নত করার জন্য কোনও কম্পিউটার প্রোগ্রামের উত্স কোডের বাহ্যিক কার্যক্ষম আচরণটি পরিবর্তন না করেই পরিবর্তন প্রক্রিয়া of" অন্যান্য উত্তরগুলি এর থেকে কীভাবে আলাদা?
পদ্মরাগ

2

অন্যান্য উত্তরে উল্লিখিত হিসাবে একটি পদ্ধতির জন্য বাইকোড সীমাতে একটি 64KB রয়েছে (কমপক্ষে সূর্যের জাভা সংকলকটিতে)

খুব তাড়াতাড়ি এই পদ্ধতিটি আরও পদ্ধতিতে বিভক্ত করা আরও অর্থপূর্ণ হবে - প্রতিটি অ্যারেতে নির্দিষ্ট কিছু নির্দিষ্ট জিনিস বরাদ্দ করা (এটি করার জন্য একটি অ্যারেলিস্ট ব্যবহার করতে আরও বুদ্ধিমান হতে পারে)

উদাহরণ স্বরূপ:

public void addArrayItems()
{
  addSculptureItems(list);
  ...
}

public void addSculptureItems(ArrayList list)
{
  list.add("sculptures");
  list.add("stonesculpture");
}

বিকল্প হিসাবে আপনি কোনও স্থিতিশীল ফাইল থেকে আইটেমগুলি স্থির করা হলে স্থিতিশীল সংস্থান থেকে লোড করতে পারেন


সঠিক উত্তরটি ডেটা এবং কোডকে কোড হিসাবে গণ্য করা।
ম্যালকম

@ ম্যালকমল ওয়েল, এটি পরিষ্কার ডেটা, এবং কোড নয়। আপনার মন্তব্য বিভ্রান্তিমূলক, কারণ আপনার যা করা উচিত নয় তা হ'ল ডেটা এবং কোড মিশ্রণ , তবে এখানে সেগুলি মিশ্রিত নয়।
এভেজেনি সার্জিভ

আমি মনে করি এটি একটি ভাল কাজ।
ব্রোঞ্জের লোক

2

আমি নিজেই এই সমস্যায় পড়েছি। আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল পদ্ধতিটি আরও পরিচালনাযোগ্য টুকরাগুলিতে রিফেক্টর এবং সঙ্কুচিত করা। আপনার মত, আমি প্রায় 10 কে লাইন পদ্ধতি নিয়ে কাজ করছি। তবে স্ট্যাটিক ভেরিয়েবলের পাশাপাশি ছোট ছোট মডুলার ফাংশন ব্যবহার করে সমস্যাটি সমাধান করা হয়েছিল।

মনে হয় আরও ভাল কাজ হবে, কিন্তু জাভা 8 ব্যবহার করে কোনও কিছুই নেই ...


1

অতিরিক্ত কোড স্পেসের জন্য আপনার কোডের জন্য স্থান তৈরি করতে আপনি অন্য একটি পদ্ধতি যুক্ত করতে পারেন, আপনার কাছে এমন একটি পদ্ধতি থাকতে পারে যা প্রচুর পরিমাণে ডেটা স্পেস নিচ্ছে। আপনার পদ্ধতিগুলি ভাগ করার চেষ্টা করুন কারণ আমার একই সমস্যা ছিল এবং আমার জাভা অ্যান্ড্রয়েড কোডে একই ডেটার জন্য আরও একটি অতিরিক্ত পদ্ধতি তৈরি করে এটি ঠিক করে ফেললাম, আমি এটি করার পরে সমস্যাটি চলে গেছে।


এটি একটি উত্তর চেয়ে মন্তব্য বেশি।
ব্যবহারকারী 3071284

0

আমার একটি এনাম রয়েছে যার কারণে জাভা ফাইলটি 500KB আকারের বেশি হয়ে যায়। গ্রহণ কোনও কারণে এটি তৈরি করতে পারে; গ্রহণ-রফতানী পিঁপড়া build.xml করতে পারে না। আমি এটি সন্ধান করছি এবং এই পোস্টটি আপডেট করব।


0

যেহেতু পদ্ধতির জন্য আকারের সীমা রয়েছে এবং আপনি এই মুহুর্তের মতো আপনার কোডটি আবার ডিজাইন করতে চান না, আপনি অ্যারেটিকে 4-5 অংশে বিভক্ত করতে পারেন এবং তারপরে এগুলি বিভিন্ন পদ্ধতিতে রেখে দিতে পারেন। অ্যারে পড়ার সময়, সমস্ত পদ্ধতিকে একটি সিরিজে কল করুন। আপনি কতগুলি সূচকে পার্স করেছেন তা জানতে আপনি একটি পাল্টা বজায় রাখতে পারেন।


0

এটি একক পদ্ধতিগুলির সমাধানের সমস্ত কোডের কারণে: আরও কিছু ছোট পদ্ধতি তৈরি করুন তবে এই ত্রুটিটি চলে যাবে


0

ঠিক আছে সম্ভবত এই উত্তরটি অনেক দেরিতে হয়েছে তবে আমি মনে করি এইভাবে অন্য কোনওভাবে চেয়ে ভাল

উদাহরণস্বরূপ, আমাদের কোডে 1000 টি সারি ডেটা রয়েছে

  1. তাদের বিরতি

    private void rows500() {
         //you shoud write 1-500 rows here
    }
    
    private void rows1000() {
         you shoud write 500-1000 rows here
    }
    
  2. উন্নত পারফরম্যান্সের জন্য আপনার কোডগুলিতে একটি "যদি" রাখুন

    if (count < 500) {
        rows500();
    } else if (count > 500) {
        rows1000();
    }
    

আমি আশা করি এই কোডটি আপনাকে সহায়তা করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.