শেল ফাইলের বিশাল পরিমাণে কীভাবে পরিচালনা করবেন?


9

s লি।

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

[হালনাগাদ]

বর্তমান উত্তরের একটি গুরুতর ত্রুটি রয়েছে, লোকেরা কেবল অভিজ্ঞতাগত পরীক্ষা ছাড়াই উত্তরগুলি পোস্ট করে। যদি তারা তাদের পরামর্শগুলি পরীক্ষা করে থাকে তবে তারা সম্ভবত ব্যর্থ হত। সুতরাং, আমি আপনাকে একটি কমান্ড-লাইন সরঞ্জাম তৈরি করেছি যার সাহায্যে আপনি বিপুল পরিমাণ ফাইল তৈরি করতে স্যান্ডবক্স তৈরি করতে পারেন এবং 1e7 পরিমাণ ফাইলের মতো আপনার পরামর্শগুলি পরীক্ষা করতে পারেন। ফাইলগুলি উত্পন্ন করতে দীর্ঘ সময় নিতে পারে তাই ধৈর্য ধরুন। কেউ যদি এটি করার দ্রুত উপায় জানেন তবে দয়া করে কোডটি সম্পাদনা করুন। python code.py --helpসহায়তা পেতে টাইপ করুন । আনন্দ কর!

প্রচুর dirred ফাইল তৈরি করতে ব্যবহারের উদাহরণ

$ ls ./data2
ls: ./data2: No such file or directory
$ python testFill.py -n 3 -d 7                                                 
$ tree data2/                                                                  
data2/
|-- 0
|   |-- 1302407302636973
|   |-- 1302407302638022
|   `-- 1302407302638829
|-- 1
|   |-- 1302407302639604
|   |-- 1302407302641652
|   `-- 1302407302642399
|-- 2
|   |-- 1302407302643158
|   |-- 1302407302645223
|   `-- 1302407302646026
|-- 3
|   |-- 1302407302646837
|   |-- 1302407302649110
|   `-- 1302407302649944
|-- 4
|   |-- 1302407302650771
|   |-- 1302407302652921
|   `-- 1302407302653685
|-- 5
|   |-- 1302407302654423
|   |-- 1302407302656352
|   `-- 1302407302656992
`-- 6
    |-- 1302407302657652
    |-- 1302407302659543
    `-- 1302407302660156

7 directories, 21 files

কোড টেস্টফিল.পি

# Author: hhh
# License: ISC license

import os, math, time, optparse, sys

def createHugeAmountOfFiles(fileAmount, dirAmount):
   counter = 0
   DENSITY = 1e7
   dir = "./data/"

   do = dir+str(counter)+"/"
   while (os.path.exists(do)):
      counter = counter+1
      do = dir+str(counter)+"/"

   os.mkdir(do)

   for d in range(int(dirAmount)):
      for f in range(int(fileAmount)):
         timeIt = int(time.time()*1e6)
         if (not os.path.exists(do)):
            os.mkdir(do)

         if (timeIt % DENSITY == 0):
            counter = counter+1
            do = dir+str(counter)+"/"

            if (not os.path.exists(do)):
               os.mkdir(do)


         do = dir+str(counter)+"/"
         if(not os.path.exists(do)):
            os.mkdir(do)

         f = open(do+str(timeIt), 'w')
         f.write("Automatically created file to test Huge amount of files.")
         f.close()
      counter = counter +1


def ls(dir):
   for root, dirs, files in os.walk("./data/"+dir):
      print(files)

def rm(dir):
   for root, dirs, files in os.walk("./data/"+dir):
      for f in files:
         os.remove("./data/"+dir+"/"+f)


def parseCli():
   parser = optparse.OptionParser()
   parser.add_option("-f", "--file", dest="filename",
                     help="Location to remove files only in ./Data.", metavar="FILE")
   parser.add_option("-n", "--number", dest="number",
                     help="Number of files to generate", metavar="NUMBER")
   parser.add_option("-r", "--remove", dest="remove",
                     help="Data -dir content to remove", metavar="NUMBER")
   parser.add_option("-d", "--dir", dest="dir",
                     help="Amount of dirs to generate", metavar="NUMBER")
   parser.add_option("-q", "--quiet",
                     action="store_false", dest="verbose", default=True,
                     help="don't print status messages to stdout")

   return parser.parse_args()

def main():
   (options, args) = parseCli()

   if (options.filename):
      ls(options.filename)
   if (options.number and options.dir):
      createHugeAmountOfFiles(options.number, options.dir)
   if (options.remove):
      rm(options.remove)


main()

2
এই স্কেলটিতে ডেটাসেটের জন্য @hhh সঠিকভাবে সূচক-এডি ডিবি সম্ভবত একমাত্র বিকল্প
xenoterracide

@ এক্সেনোটেরাকাইড: তবে ডিবিএসকে অবশ্যই অ্যারে জাতীয় কিছু দিয়ে দ্রুত অনুসন্ধান কার্যকর করতে হবে, ডিবি একটি ওভারকিল শোনায়। ছবি তোলার জিনিসটির উত্স এখানে: github.com/fsphil/fswebcam । সম্ভবত, আমি ছবিটি সংরক্ষণ করার সময় এটি কিছুটা সংশোধন করতে পারি যাতে আমি ইনড নম্বর এবং ফাইলগুলিতে ইউনিক্স-টাইম-স্ট্যাম্প সহ একটি লাইন যুক্ত করতে পারি। এখন ছবিগুলি নয় তবে লাইনের সাথে নয়, ছবিগুলি অনুসন্ধান করা আরও দ্রুত হবে। বা আরও সহজে, প্রতিবার একটি ডিস্কে ছবি সংরক্ষণ করা হয়, আমি তার টাইম-স্ট্যাম্পের একটি ফাইলের সাথে একটি লাইন যুক্ত করি। বৃত্তাকার চারপাশে সমাধান। তবে বর্তমানের ছবিগুলির সাথে সমস্যার সমাধান হবে না সুতরাং প্রাসঙ্গিক প্রশ্ন।

আপনি কী ফাইল সিস্টেম ব্যবহার করছেন? বা এখনও এটি গুরুত্বপূর্ণ নয় ... ext এর কিছু কর্মক্ষমতা বাড়ানোর বৈশিষ্ট্য রয়েছে যা ডিফল্টরূপে নাও থাকতে পারে। যদিও এটি সম্ভবত আপনি যে স্কেলটির সাথে কথা বলছেন তা কার্যকর করবে না। ডিবি এই বিষয়গুলির জন্য অনুকূলিত এবং এগুলি মোকাবেলা করার জন্য বিভিন্ন সূচক সমাধান রয়েছে। উদাহরণস্বরূপ, একটি বিটি্রি সূচক কেবল একটি সাধারণ অ্যারে নয় ...
xenoterracide

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

1
আপনার কি একক ডিরেক্টরিতে কয়েক মিলিয়ন ফাইল রয়েছে? যদি তাই হয় তবে আপনি ফাইলের নামের প্রথম অক্ষরের উপর ভিত্তি করে এক বা দুই স্তরের গভীর সাবডিয়ার দ্বারা বিভাজন বিবেচনা করতে পারেন, যেমন:a/b/abcdef.jpg
অ্যালেক্স

উত্তর:


4

একটি আলাদা শেল চেষ্টা করুন। আমি উদাহরণস্বরূপ zsh চেষ্টা করার পরামর্শ দেব এবং এটি আরও পরামিতিগুলির অনুমতি দেয় কিনা তা দেখুন।

যদি আমি সঠিকভাবে বুঝতে পারি তবে ফাইল নামের অংশটি হল একটি ইউনিক্স টাইমস্ট্যাম্প। ফোল্ডারগুলিতে ফাইলগুলি বিভক্ত করার পরামর্শ দেওয়া উচিত। যদি তারিখ / সময় বিন্যাসটি একটি ইউনিক্সের যুগের সংখ্যা হয় তবে একটি পৃথক ফোল্ডারে 10000 এর সংখ্যাটি লিখুন that সংখ্যার ভগ্নাংশ রাখুন।

যদি কোনও আইএসও 8601 টাইমস্ট্যাম্প ফাইলের নাম হয় তবে কেবল বছর, মাস বা দিন দ্বারা ভাগ করুন।


1
ls এবং সন্ধানগুলি কোনওভাবেই বাশ বা জেডএসে অন্তর্নির্মিত নয়, সুতরাং শেলগুলি স্যুইচিং কীভাবে এই পরিস্থিতিতে সহায়তা করবে তা অস্পষ্ট।
রবিন গ্রিন

এটি শেল সম্প্রসারণ সম্পর্কে। শেলটি যদি গ্লোববিংকে প্রসারিত করতে না পারে তবে এটি সমস্যা হতে পারে।
পোলেমন ২১

আমি 1e6 সম্পর্কে ফাইল কমান্ড চলমান কয়েক পরীক্ষা ZSH একই সমস্যা মুখোমুখি করেছেন: "$ cp * Test/ ksh: cp: Argument list too long % rm * zsh: sure you want to delete all the files in /home/user/Downloads [yn]? y zsh: argument list too long: rm % ls * zsh: argument list too long: ls "। দুঃখিত তবে আমি দেখতে পাচ্ছি না যে এটি প্রশ্ন -১ এর সাথে কীভাবে সম্পর্কিত কারণ এটি পরীক্ষা করা এত সহজ ছিল, মাত্র 1e6 ফাইল তৈরি করুন এবং কমান্ডগুলি চালান।

1

চান locate(এবং অবশ্যই updatedb) আপনি কোনো সাহায্যের হবে?


1
updatedbব্যবহার find
dave1010

@ ডেভ 1010, নিশ্চিত, তবে এটি একবারে পটভূমিতে একবার করে তোলে, সুতরাং যদি ওপি-র কাছে এটি গ্রহণযোগ্য হয় যে প্রতি মিনিটে প্রয়োজন হয় না, তবে দিনে একবার হতে পারে, তবে নির্ধারিত সময়ে একটি নির্ধারিত সময়ের জন্য আপডেটবিড করুন (বা তফসিলটি ঘন ঘন আপডেট করা হয় তবে স্বল্প অগ্রাধিকারে, যা এটি যাইহোক হওয়া উচিত), তারপরে অবস্থানটি ব্যবহার করা কী চান তা সন্ধান করতে খুব দ্রুত। সুতরাং মূল প্রশ্নটি ডিবি (বা অন্য কোনও সিস্টেমের জন্য সূচক) কীভাবে আপ টু ডেট হওয়া দরকার।
asoundmove
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.