আমি কীভাবে অত্যন্ত দীর্ঘ লাইনগুলিকে ইমাসকে ধীর করে তুলতে পারি?


72

আমি যে ফাইলটি ঘুরে দেখছি সেখানে কতগুলি নতুন লাইন রয়েছে তার উপর নির্ভর করে আমি বিস্তর পারফরম্যান্স দেখছি।

এখানে একটি উদাহরণ। আমার কাছে দুটি জেএসএন ফাইল রয়েছে:

$ wget https://github.com/Wilfred/ReVo-utilities/blob/a4bdc40dd2656c496defc461fc19c403c8306d9f/revo-export/dictionary.json?raw=true -O one_line.json
$ python -m json.tool <one_line.json >pretty_printed.json

এটি একই বিষয়বস্তু সহ দুটি JSON ফাইল। one_line.jsonকোনও নতুন লাইন ছাড়াই JSON এর 18MiB। pretty_printed.jsonনতুন লাইন এবং হোয়াইটস্পেস যুক্ত হয়েছে, এটি 41MiB করে।

তবে, অনেক লাইনের বিপরীতে বড় ফাইল বিভাজকটি জাভাস্ক্রিপ্ট মোড এবং ফান্ডামেন্টাল মোড উভয়ই ইমাসে খোলার জন্য আরও দ্রুত is

দীর্ঘ লাইনের সাথে ইমাকসের এত খারাপ অভিনয় কেন, কারণ এটি আসলে কম বাইট? ইমাসের বাইরে ডেটা পুনরায় ফর্ম্যাট না করে পারফরম্যান্স উন্নত করতে আমি কি কিছু করতে পারি?


2
সত্যই কোনও উত্তর নয় তবে এটি কার্যকর হতে পারে: View Large Files(ভিএলএফ) একটি ছোটখাটো মোড যা বড় ফাইলগুলিকে ব্যাচে লোড করে সম্পাদনা করতে সহায়তা করে । দাবি অস্বীকার: আমি কখনই এটি ব্যবহার করি নি এবং জানি না এটি ব্যাচগুলিতেও লম্বা লাইন পরিচালনা করে কিনা ।
এলেমাকিল

3
এই ধরণের আচরণ সম্পর্কে জানার এবং বিশেষত যখন একটি লম্বা লাইন ছড়িয়ে দেয় এমন লগ পড়ার বিরুদ্ধে নিজেকে রক্ষা করার চেষ্টা করার সময় আমি প্রায়শই $ tail -f /some/file | fold -sশেল বাফারের মতো কিছু করি । এটি সম্পাদনার পক্ষে স্পষ্টতই ভাল নয়, তবে পড়াতে অনেক সাহায্য করে।
wvxvw

উত্তর:


50

দীর্ঘ লাইনের ইমাক্স পরিচালনা করা খুব ভালভাবে অনুকূলিত হয় না। বেশ কয়েকটি ক্রিয়াকলাপের জন্য, ইমাসকে বারবার পুরো লাইনটি স্ক্যান করতে হবে। উদাহরণস্বরূপ, একটি লাইন প্রদর্শন করতে, ইমাসকে লাইনটির উচ্চতা নির্ধারণ করতে হবে, যার জন্য দীর্ঘতম গ্লাইফটি সন্ধান করার জন্য পুরো লাইনটি স্ক্যান করতে হবে। অধিকন্তু, দ্বিপাক্ষিক প্রদর্শনের জন্য স্ক্যান করা অনেক সময় খায়। আপনি কিছু অতিরিক্ত তথ্য পেতে পারেন, উদাহরণস্বরূপ, এর ডক্টস্ট্রিং cache-long-line-scans( cache-long-scans24.4 এ নাম পরিবর্তন করা হয়েছে)।

আপনি চেষ্টা করুন এবং দেখুন সেটিং যদি পারেন bidi-paragraph-directionকরতে left-to-rightআপনার জন্য গতি উন্নত [সেটিং bidi-display-reorderingথেকে nil, বেশী বা কম একই আছে কিন্তু শুধুমাত্র অভ্যন্তরীণ / ডিবাগিং উদ্দেশ্যে বোঝানো হয়]। এটি লাইন স্ক্যানগুলির ক্ষেত্রে উল্লেখযোগ্য অবদানকারীকে সরিয়ে দেয়, তবে দুঃখের বিষয় কেবল একটাই নয়।

সেরা বিকল্প হ'ল নতুন লাইন যুক্ত করা। আপনি python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'নতুন পংক্তি যোগ করতে এবং সাধারণভাবে পাঠযোগ্যতা উন্নত করতে উদাহরণস্বরূপ একটি JSON ফাইলটি পাইপ করতে পারেন ।


4
কৌতূহলের বাইরে, এটি কি এমন কিছু যা অ্যালগোরিদমিকভাবে উন্নত করা যায় না?
পাইথননট

9
কোনও সম্পাদকের অন্তর্নিহিত ডেটা কাঠামোটি বেছে নেওয়ার সময় আপনাকে কিছু ভাল বাছাই করতে হবে। ইমাকস একটি ফাঁক বাফার ব্যবহার করে যা সন্নিবেশ এবং মুছে ফেলার জন্য একটি উচ্চ স্থান দক্ষ ডেটা কাঠামো, তবে আপনাকে লাইন-ভিত্তিক ক্রিয়াকলাপগুলি ধীর করে দেয় কারণ আপনাকে একটি নতুন লাইনের জন্য ধারাবাহিকভাবে স্ক্যান করতে হবে। ইমাসগুলি একটি পৃথক ডেটা কাঠামো ব্যবহার করতে পারে তবে এটি অন্যান্য ক্রিয়াকলাপকে ধীর করে দেবে। ইমাক্স ইতিমধ্যে একটি লাইন ক্যাশে ব্যবহার করেছে, তবে এটি সমস্ত পরিস্থিতিতে সত্যই সহায়তা করে না। সুতরাং, সহজেই অ্যালগোরিদমিকভাবে উন্নত হয় নি, তবে প্রোফাইলিং এবং অনুকূলকরণ কখনই ব্যথা করে না। :-)
জর্জেন শোফার

4
(setq-default bidi-display-reordering nil)- কিছু ব্যবহারকারী বুঝতে পারে না যে এটি একটি বাফার-লোকাল ভেরিয়েবল, যা কোনও ব্যবহারকারী এটি যে বিশ্বব্যাপী হতে চায় তার মাত্রায় একটি ডিফল্ট সেটিংসের প্রয়োজন হতে পারে। আমি আশা করি আমি আমার init.elবছর আগে এটি যোগ করা উচিত ... তবে কমপক্ষে এটি এখন সেখানে আছে। তাই আপনাকে অনেক ধন্যবাদ!!!
আইনজীবি

আমার ক্ষেত্রে এটি কোনও বড় ইমপ্রোভেন্ট ছিল না (বেস 64 নথির বডিসহ লম্বা জসন লাইনগুলি) তবে
বিন্যাস

1
বিআইডিআই কোড লিখেছেন, বর্তমান ইমাস রক্ষণাবেক্ষণকারী, এলি স্যুইচ অফ করার বিষয়ে লিখেছেন bidi-display-reordering: "আমার একটি মন্তব্য হ'ল বিডি -ডিসপ্লে-রর্ডারিং অক্ষম করা ... ডিসপ্লে ইঞ্জিনটিকে এমন একটি অবস্থায় ফেলেছে যা পরীক্ষা করা হচ্ছে না, এবং অসঙ্গতি সৃষ্টি করতে পারে এমনকি বাগগুলিও (কারণ কোডের কিছু অংশ এই পরিবর্তনশীলটি কখনই শূন্য নয় এমন ধারনাতে লেখা হয়েছিল) "।
ক্লিমেট

18

জ্যাকুরির একটি ক্ষুদ্রাকৃত কপি ব্যবহার করে এটি নিয়ে আমি কয়েকটি সংক্ষিপ্ত পরীক্ষা-নিরীক্ষা করেছি। font-lock-modeএবং flycheck-modeদু'জনই স্বচ্ছলতাতে অবদান রেখেছিল, যেমন করেছিল js2-mode, এবং prettify-symbols-modeline-number-modeএবং column-number-modeএর সামান্য প্রভাব ছিল। পারফরম্যান্স তুলনামূলকভাবে সুন্দর হলেও একবার আমি সমস্ত বিভিন্ন মোড বন্ধ করে দিয়েছিলাম। C-h mসক্ষম হয়ে থাকা বিভিন্ন মোডকে অক্ষম করা এবং ব্যবহার শুরু করুন বা কেবলমাত্র স্যুইচ করার চেষ্টা করুন fundamental-mode

আকর্ষণীয়ভাবে ব্যবহার করে hexl-modeআমি কোনও সমস্যা ছাড়াই ফাইলটি দিয়ে উড়ে যেতে পারি, যদিও স্পষ্টতই কলামগুলি খুব ছোট ছিল। দুর্ভাগ্যক্রমে visual-line-modeসত্যই জিনিসগুলি ধীর করে দিয়েছে।

আমার অনুমান যে সিনট্যাক্স টেবিলটি লাইন সমাপ্তিতে প্রক্রিয়াকরণ বন্ধ করতে পেরে খুশি এবং যখন এটি সমস্ত এক লাইনে থাকে তখন প্রতিটি আপডেটে সমস্ত কিছু প্রতিস্থাপন করতে হয়।


2
আপনি কি ফ্লাইচেকের ট্র্যাকারে একটি বাগ রিপোর্ট খুলতে পারেন? আমি নিশ্চিত যে আমরা দীর্ঘতর লাইনের কারণে সমস্যা সৃষ্টি করতে চাই না, এবং ইমাকস + ফ্লাইচেক ইমাক্সের চেয়ে খারাপ হওয়া উচিত নয় (যা এখনও বেশ খারাপ)।
ক্লাইমেন্ট

16

আমি http://www.emacswiki.org/emacs/OverLongLineMode আপলোড করেছি

এই লাইব্রেরিটি আপনাকে সাধারণ লাইন-দৈর্ঘ্যের প্রান্তিক সেটগুলি সেট করতে সক্ষম করে যার বাইরে fundamental-modeকোনও ফাইলের জন্য তার সাধারণ মোডের পরিবর্তে (কেবলমাত্র প্রোগ্রামিং মোডের জন্য) বিভিন্ন রূপ ব্যবহার করা হবে।

সম্ভাব্যভাবে এই রেখাসমূহের সাথে কিছু কিছু ডিফল্টভাবে ইমাসগুলিতে যুক্ত করা যেতে পারে তবে ইমাসের প্রাথমিক সমস্যার জন্য এটি কোনও ফাইলের মুখোমুখি হওয়ার পরে ক্রলটিতে ধীর হয়ে যায় for

এনবি এটি প্রাথমিকভাবে এই উত্তরে পোস্ট করা কোডটির উপরে উন্নতি, তবে এখনও একটি কার্য-অগ্রগতি। পরীক্ষাটি ন্যূনতম হয়েছে। মন্তব্য স্বাগত জানানো হয়।

ডিফল্টরূপে সমর্থন করার জন্য অন্যান্য (ছাড়াও css-mode) অ- prog-modeবিবর্তিত প্রধান মোডগুলির জন্য পরামর্শগুলিও স্বাগত।


1
এখন আরও উন্নত হয়েছে, এবং লজ্জাজনকভাবে so-long.el :) নামকরণ হয়েছে (উপরের লিঙ্কটি পুনঃনির্দেশ করবে)। এটি দিয়ে আরও অনেক কিছু করা যেতে পারে তবে এটি 100% কার্যকরী এবং যেমনটি কার্যকর।
22:48 '

এটি একটি দুর্দান্ত সমাধান (এটি মেলপাতে দেখতে ভাল লাগবে) তবে ওয়ান_লাইন.জসন খোলার সময় আমার ইমাস উদাহরণটি এখনও অত্যন্ত ধীর। আমি মনে করি এটি প্রথমে মূল মোডটি সক্রিয় না করলে এটি উল্লেখযোগ্যভাবে দ্রুত হবে faster
উইলফ্রেড হিউজ 14

3
এটিকে পুনরায় পড়া এবং প্রশ্ন থেকে আপনার one_line.json ফাইলটি ব্যবহার করে, আমি ডিফল্ট-কনফিগার ইমাস 25.3 এবং 26.0.91 এর জন্য তাদের ফাইলটি (এক মিনিটেরও বেশি অপেক্ষা করার পরে) খুলতে বলার পরে প্রতিক্রিয়া জানাতে ছাড়লাম, যেখানে আমার নিজের so-long.elসক্রিয় সঙ্গে কনফিগার 2 সেকেন্ডের মধ্যে ফাইল খুলুন। প্রকৃতপক্ষে ফাইলটি সম্পাদনা করা এখনও বিশাল সমস্যাযুক্ত (যেমন 'পরবর্তী পংক্তিতে যাওয়ার চেষ্টা করা' অত্যন্ত দীর্ঘ সময় নেবে) তবে তা সত্ত্বেও এটি আমার লেখা লাইব্রেরির উপযোগিতা সম্পর্কে আমার বিশ্বাসকে পুনরুদ্ধার করে, তাই আমার পরিকল্পনাগুলি আবার শুরু করা উচিত এটি জিএনইউ
ইএলপিএতে যুক্ত করুন

1
এটি এখনও (এম) ইপিএ-তে রয়েছে?
বিনকি

3
স্থিতির প্রতিবেদন: so-long.elইমেলস 27 এর বর্তমান বিকাশের সংস্করণগুলিতে (বহু সংখ্যক বর্ধনের সাথে) সংস্করণ 1.0 অন্তর্ভুক্ত করা হয়েছে এবং অদূর ভবিষ্যতে জিএনইউ ইএলপিএর মাধ্যমে পাওয়া যাবে (ইমাকের আগের সংস্করণগুলির জন্য)।
ফিলস

7

আমি আশা করি আপনি খুঁজে পাবেন যে পার্থক্য কারণে font-lock। উইন্ডোতে দৃশ্যমান ফাইলের উপসেটে যখন ফন্টিফিকেশন করা হয়, তখন এটি প্রথমে ফোন্টিফিকেশন অঞ্চলটি প্রসারিত করে এগিয়ে যায় যাতে এতে সম্পূর্ণ শব্দার্থক ইউনিট অন্তর্ভুক্ত থাকে। font-lock-extend-region-functionsএই জন্য কোড দেখুন । অঞ্চলটিকে সম্পূর্ণ লাইন অন্তর্ভুক্ত করার জন্য এটি অন্তর্ভুক্ত করা সাধারণ common যখন লাইনগুলি দীর্ঘ হয়, এটি প্রকৃত দৃশ্যমানের চেয়ে অনেক বড় সামগ্রীর মধ্যে ফন্টিফিকেশন পরিচালিত করতে পারে।

তদ্ব্যতীত, যখন নিউলাইনগুলি নিজের কাছে অর্থবোধক তথ্য রাখে, তাদের অনুপস্থিতি কখনও কখনও অর্থ হতে পারে যে ফন্ট লকের জন্য রেজিপ্লেক্স নিদর্শনগুলি মেলে কিনা তা নির্ধারণের জন্য আরও স্ক্যান করতে হবে have


7

আমি সাধারণত লম্বা লাইনগুলি আনআরল করি এবং ট্যাগগুলি দ্বারা অন্তর্ভুক্ত করি (যেমন এইচটিএমএল, এক্সএমএল, জেএসএন)।

এই জাতীয় অপারেশনকে সম্ভব করার জন্য আমি যুক্ত করছি:

(setq line-number-display-limit large-file-warning-threshold)
(setq line-number-display-limit-width 200)

(defun my--is-file-large ()
  "If buffer too large and my cause performance issue."
  (< large-file-warning-threshold (buffer-size)))

(define-derived-mode my-large-file-mode fundamental-mode "LargeFile"
  "Fixes performance issues in Emacs for large files."
  ;; (setq buffer-read-only t)
  (setq bidi-display-reordering nil)
  (jit-lock-mode nil)
  (buffer-disable-undo)
  (set (make-variable-buffer-local 'global-hl-line-mode) nil)
  (set (make-variable-buffer-local 'line-number-mode) nil)
  (set (make-variable-buffer-local 'column-number-mode) nil) )

(add-to-list 'magic-mode-alist (cons #'my--is-file-large #'my-large-file-mode))

আমি Regex করে সীমারেখা বিভক্ত, এটা এক্সএমএল জন্য: C-M-% >< RET >NL< RET !

ইমাসগুলি দীর্ঘ লাইনগুলি বিভক্ত করার পরে - অনেকগুলি *-modesএবং পুনরায় ইনডেন্ট কোড সক্ষম করা সম্ভব ।

দ্রষ্টব্যটির জন্য: যখন কোনও নিকৃষ্ট প্রক্রিয়া দীর্ঘ লাইন উত্পন্ন করে তখন ধীরগতির প্রতিরোধ কীভাবে?


4

আমি এখানে এই সমস্যার জন্য আমার নিজস্ব সমাধান তৈরি করেছি: https://github.com/rakete/too-long-lines-mode

আমি ফিলস সমাধানে সন্তুষ্ট নই যা খুব দীর্ঘ লাইনের সাথে বাফারকে মৌলিক-মোডে স্যুইচ করে, আমি এমন একটি সমাধান চাইছিলাম যা আমাকে সিনট্যাক্স হাইলাইট এবং অন্যান্য বড়-মোড বৈশিষ্ট্যগুলিতে রাখতে দেয়। সুতরাং আমি একটি গৌণ-মোড তৈরি করেছি যা অতিরিক্ত দীর্ঘ লাইনের বেশিরভাগ অক্ষরকে আড়াল করতে ওভারলেগুলি ব্যবহার করে।

এটি সমস্যার চারপাশে কাজ করে এবং মৌলিক-মোডে ফিরে না পড়ে খুব দীর্ঘ লাইনযুক্ত বাফারগুলিতে ইম্যাকগুলি ব্যবহারযোগ্য করে তোলে।


2

আমার ইমাস সেটআপে আমার কাস্টম ফন্টিফিকেশন সহ একটি মোড রয়েছে, যেখানে আমি সেট করেছি font-lock-defaults। নীচের একটি পৃষ্ঠায় 30000 অক্ষর রেখার অংশটি প্রদর্শন করতে 30 সেকেন্ড ব্যবহার করা হবে। এই ধীরগতিটি রেজিএক্সপ্যাক ব্যাকট্র্যাকিং হ্রাস করে স্থির করা হয়েছিল। পরিবর্তে:

  ("। * একটি অসম্পূর্ণ কমান্ড দিয়ে শেষ হয়েছে *" 0 ফন্ট-লক-মন্তব্য-মুখ)

এটা কর

  ("^। \ 1,80 \ an একটি অসম্পূর্ণ কমান্ড দিয়ে শেষ হয়েছে *" 0 ফন্ট-লক-মন্তব্য-মুখ)

এটি প্রশ্নের উত্তর নয়, যা বিশেষত font-lock-defaultsম্যাচ সম্পর্কিত বা রেজিপেক্সের নয় ।
ড্রিউ

1
@Drew আদর্শ Regex কম হয় উপার্জন যদিও ... দীর্ঘ লাইন ধীর ফন্ট-লক
wasamasa

1
@ ওয়াসমাসা: হ্যাঁ প্রশ্ন নিজেই খুব বিস্তৃত, আইএমও। লম্বা লাইন জড়িত থাকাকালীন প্রচুর পরিমাণে জিনিসগুলি ইম্যাককে ধীর করতে পারে (এবং কোন ক্রিয়াগুলির জন্য?)।
ড্রিউ

3
আমি মনে করি না যে প্রশ্নটি বিস্তৃত (" দীর্ঘ লাইনগুলি ইমাকগুলিকে ধীর করে কেন ")? এবং আমিও মনে করি না যে উত্তরটি প্রশ্নের সমাধান করে না (" একটি সম্ভাব্য কারণ হ'ল সাবঅপটিমাল রিজেক্সপস")। অন্যান্য উত্তরগুলি অন্য কারণগুলিকে সম্বোধন করতে পারে। দীর্ঘ লাইন দিয়ে একটি ফাইল খোলার বিষয়টি কেবল একটি বিষয়কে প্রশস্ত করার জন্য নয় কারণ এটি বিভিন্ন কারণে সমস্যাযুক্ত হতে পারে, কখনও কখনও আপনার কাছে এ জাতীয় ফাইল থাকে এবং আপনার এগুলি দেখতে হবে, সাধারণত ইমাস ব্যবহার করে।
তারসিউস

1

আমার শেল-মোড বাফারগুলিতে (এমএক্স শেল) sed -r 's/(.{2000}).*/\1/' -uলম্বা লাইনগুলি এড়াতে আমি নিজেকে পাইপ পাই ।


এটি প্রশ্নের দ্বিতীয় অংশটির উত্তর দেয়: কীভাবে কর্মক্ষমতা বাড়ানো যায়। এটি প্রথম অংশটিকে সম্বোধন করে না (যা ঠিক আছে): " দীর্ঘ লাইনের সাথে ইমাকসের এত খারাপ অভিনয় কেন ?"
ড্র হয়েছে

0

dired-modeলম্বা লাইনযুক্ত বড় ফাইলগুলিতে খোলার জন্য আমি নিম্নলিখিত ফাংশনটি ব্যবহার করি :

(defun dired-find-file-conservatively ()
   (interactive)
   (let ((auto-mode-alist nil))
     (dired-find-file)
     ;; disable costly modes
     (fundamental-mode)
     (setq-local bidi-display-reordering nil)
     (when (boundp 'smartparens-mode)
       (smartparens-mode -1))))

(define-key dired-mode-map (kbd "S-<return>") 'dired-find-file-conservatively)

0

ইমাকস-ডেভেল থেকে নেওয়া এখানে একটি কার্যনির্বাহী :

(add-hook 'find-file-hook
          (defun my-find-file-care-about-long-lines ()
            (save-excursion
              (goto-char (point-min))
              (when (and (not (eq major-mode 'image-mode))
                         (search-forward-regexp ".\\{2000\\}" 50000 t)
                         (y-or-n-p "Very long lines detected - enable 
longlines-mode? "))
                (require 'longlines)
                (longlines-mode +1)))))

ইমাসে 24.4 এর longlines-modeহিসাবে এটি অপ্রচলিত হিসাবে চিহ্নিত হয়েছে visual-line-mode
আলেকজান্ডার আই.গ্রাভভ

তবে দুটি বৈশিষ্ট্যই পর্দার আড়ালে খুব আলাদা জিনিস visual-line-modeকরে , এবং সমস্যাটিতে প্রশ্নটির ক্ষেত্রে সহায়তা করে না, যদিও longlines-modeতা করে। এই কারণে, আমি প্রত্যাশা করি যে লংগলাইনস.এলকে একটি অবহিত স্থিতিতে ফিরিয়ে দেওয়া হবে।
ফিল্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.