ফাইলগুলি সংযুক্ত করার দ্রুততম উপায়


25

আমার কাছে 20 গিগাবাইটেরও বেশি 10k + ফাইল রয়েছে যা আমাকে একটি ফাইলে সংযুক্ত করতে হবে।

এর চেয়ে আরও দ্রুত উপায় আছে কি?

cat input_file* >> out

?

পছন্দসই উপায়টি ব্যাশ কমান্ড হবে, যথেষ্ট ধীর না হলে পাইথনও গ্রহণযোগ্য।


আমার উত্তর আপডেট করেছে, findশেল গ্লোব হিসাবে একই ফাইল বাছাই করে না।
গ্রিমে

5
যে কোনও এবং সমস্ত (বুদ্ধিমান) সমাধানগুলির এখানে সমমানের গতি থাকবে কারণ সময়টি 99% সিস্টেম I / O হবে।
সোনারলোকস


3
আপনি যে (গুলি) থেকে পড়ছেন তার চেয়ে আলাদা ডিস্কে সংযুক্ত ফাইলটি লেখার বিষয়টি বিবেচনা করে।
লুইস

1
outঅন্য ডিস্কে অবস্থিত থাকলে এটি দ্রুত হবে ।

উত্তর:


30

না, বিড়াল অবশ্যই এটি করার সর্বোত্তম উপায়। এই উদ্দেশ্যে সিটিতে ইতিমধ্যে একটি প্রোগ্রাম লিখিত আছে কেন অজগর ব্যবহার করবেন? তবে, xargsকমান্ড লাইনের দৈর্ঘ্য বেশি হয়ে গেলে ARG_MAXএবং আপনার একাধিকের প্রয়োজন হলে আপনি ব্যবহারটি বিবেচনা করতে পারেন cat। জিএনইউ সরঞ্জামগুলি ব্যবহার করে এটি আপনার ইতিমধ্যে যা আছে তার সমান:

find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z |
  xargs -0 cat -- >>out

1
আপনি কি এই ক্ষেত্রে বীমা করতে পারেন যে আপনার ফাইলগুলি ক্রমে পড়বে?
কিউই

1
হ্যাঁ, কারণ আউটপুট findপাইপ করা হয়েছে sort। এটি ছাড়া ফাইলগুলি একটি স্বেচ্ছাসেবী ক্রমে তালিকাভুক্ত করা হবে (ফাইল সিস্টেম দ্বারা সংজ্ঞায়িত, যা ফাইল তৈরির আদেশ হতে পারে)।
স্কাই

@ এসইএসআই আমি দুঃখিত, আমি এড়িয়ে চাইলাম, সাজানোর সাথে এটি বেশ সুস্পষ্ট
কিউই

1
@ কিউই, কেবলমাত্র আমি দেখতে পাচ্ছি যদি পরিবেশে লোকালগুলি সঠিকভাবে সেট না করা থাকে তবে স্র্টটি কোনও গ্লোব থেকে আলাদা আচরণ করতে পারে bash। তা না হলে আমি কোনো ক্ষেত্রে যেখানে দেখতে না xargsবা catআশানুরূপ আচরণ না।
গ্রামীণ

3
@ মার্কওয়ানলিউউইন, কার্যকর করার জন্য E2BIG ত্রুটি এড়াতে প্রয়োজনীয় হিসাবে xargsকল করবে cat(2)
স্টাফেন চেজেলাস

21

প্রথমে আউটপুট ফাইলের জন্য স্থান বরাদ্দকরণ সামগ্রিক গতির উন্নতি করতে পারে কারণ সিস্টেমকে প্রতিটি লেখার জন্য বরাদ্দ আপডেট করতে হবে না।

উদাহরণস্বরূপ, লিনাক্সে থাকলে:

size=$({ find . -maxdepth 1 -type f -name 'input_file*' -printf '%s+'; echo 0;} | bc)
fallocate -l "$size" out &&
  find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z | xargs -r0 cat 1<> out

আরেকটি সুবিধা হ'ল পর্যাপ্ত ফাঁকা জায়গা না থাকলে অনুলিপিটি চেষ্টা করা হবে না।

যদি চালু থাকে তবে btrfsআপনি copy --reflink=alwaysপ্রথম ফাইলটি (যা কোনও ডেটা অনুলিপি বোঝায় না এবং তাই প্রায় তাত্ক্ষণিক হবে), এবং বাকীটি সংযোজন করতে পারেন। যদি 10000 ফাইল থাকে তবে সম্ভবত প্রথম ফাইলটি খুব বড় না হওয়া সত্ত্বেও এটি খুব বেশি পার্থক্য করতে পারে না।

সমস্ত ফাইল (দ্য BTRFS_IOC_CLONE_RANGE ioctl) কে পুনরায় অনুলিপি করতে সাধারণীকরণের জন্য একটি এপিআই রয়েছে , তবে আমি সেই এপিআইটি প্রকাশ করে এমন কোনও ইউটিলিটি পাইনি, সুতরাং আপনাকে এটি সিতে করতে হবে ( pythonবা অন্য ভাষাগুলি যদি তারা নির্বিচারে কল করতে পারে ioctl) ।

যদি উত্স ফাইলগুলি অপ্রয়োজনীয় হয় বা NUL টি অক্ষরের বৃহত্তর ক্রম থাকে তবে আপনি (GNU সিস্টেমে) সাথে একটি স্পারস আউটপুট ফাইল (সময় এবং ডিস্কের স্থান সাশ্রয় করে) তৈরি করতে পারেন:

find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out

1
@XTian, না, এটা হওয়া উচিত তন্ন তন্ন >না >>, কিন্তু 1<>লিখতে আমি আগেই বলেছি মধ্যে ফাইল।
স্টাফেন চেজেলাস

5
@ গ্রেবনেকে, <>হ'ল স্ট্যান্ডার্ড বোর্ন / পসিক্স রিড + রাইটিং রিডাইরেশন অপারেটর। বিশদের জন্য আপনার শেল ম্যানুয়াল বা পসিক্স স্পেসটি দেখুন। ডিফল্ট fdহল 0জন্য <>অপারেটর ( <>-এর সংক্ষিপ্ত রূপ 0<>, মত <-এর সংক্ষিপ্ত রূপ 0<এবং >স্বল্প 1>যাতে আপনি প্রয়োজন,) 1স্পষ্টভাবে পুনর্নির্দেশ stdout- এ। এখানে, এটি এতোটুকুও নয় যে আমাদের + লিখুন ( O_RDWR) পড়তে হবে , তবে আমরা চাই না O_TRUNC(যেমন হিসাবে >) আমরা কী বরাদ্দ করেছি তা হ্রাস করতে পারে।
স্টাফেন চেজেলাস

1
@grebneke, unix.stackexchange.com/search?q=user%3A22565+%22%3C%3E%22 আপনাকে কয়েকটি দেবে। ksh93 অপারেটরদের বিটিডব্লিউ খুঁজছেন, এবং আপনি ddপড়া বা পড়া মাধ্যমে এগিয়ে চাইতে পারেন ।
স্টাফেন চেজেলাস

1
@ স্টাফেনচাজেলাস - অনেক ধন্যবাদ, আপনার সহায়তা এবং জ্ঞানের গভীর প্রশংসা করা হয়েছে!
grebneke

1
আমি নিশ্চিত নই যে এমন অনেকগুলি ক্ষেত্রেই fallocateঘটবে যেখানে অতিরিক্তের ওভারহেডটিকে উপেক্ষা করা হবে find, যদিও এটি দ্বিতীয়বারের মতো দ্রুত হবে। btrfsঅবশ্যই কিছু আকর্ষণীয় সম্ভাবনা খোলে যদিও।
গ্রেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.