PDA

View Full Version : گفتگو: سریع ترین روش اضافه کردن پیشوند به عناصر زیاد یک لیست یا فایل متنی



s3rv3r
پنج شنبه 12 بهمن 1391, 22:29 عصر
سلام دوستان

میخواستم درباره سریع ترین روش اضافه کردن پیشوند به عناصر یک لیست با هم گفت و گو کنیم

یه فایلی دارم که حاوی 1 میلیارد سطر هست و میخواییم یه پیشوند به هر سطر اضافه کنیم

میشه با حلقه for اینکارو انجام داد ولی مدت زمان زیادی طول میکشه که این کار انجام بشه

شاید بگید 1 میلیارد چیزی نیست ولی با 10 یا 100 میلیارد سطر چه باید کرد؟؟

ممنون میشم روش های خودتون رو مطرح کنید

aliasghar2
پنج شنبه 12 بهمن 1391, 23:08 عصر
میشه با linq از عناصر لیست یه کوئری بگری بعد اونو به لیست بایند کنی
var items =
box.Items.Cast<ListItem>()
.Select(item => "ALI" + item.Value });

plus
پنج شنبه 12 بهمن 1391, 23:21 عصر
1 میلیارد سطر خیلی زیاده، به نظر من باید روشتون رو کلن عوض کنید چون در هر صورت کاری که میخواین بکنند کند هست.
بهرحال، for روش سریعتری نسبت به بقیه روش هاست منتها اینکه چطوری ای عمل رو در سریع ترین حالت انجام بدین مهمه.توی این مساله نکته ای که هست اینه که نوشتن وسط یک فایل، نیازمند اینه که بقیه فایل به جلو شیفت داده بشه و این موضوع هست که موجب کندی کار میشه.
کاری که میتونید بکنید اینه که، اول، از آخر فایل، شیفت ها رو انجام بدین، و بعد در محل های مورد نظر (که خالی شده) مقدار جدید رو بنویسید.مثلا فرض کنیم فایل شما اینطوری باشه:


This is first line
Second line
Third line

و شما میخواین یه چنین چیزی داشته باشید:


This is first lineX
Second lineX
Third lineX


اگه از بالا به پایین عمل کنید، حجم اطلاعاتی که شیفت داده میشه خیلی بیشتره، اول،


Second line
Third line

یکبار به جلو شیفت داده میشه تا X اول نوشته بشه. بعد


Third line

یکبار به جلو شیفت داده میشه تا X دوم نوشته بشه و بعد X سوم اضافه میشه.در صورتی که بخوایین از آخر عمل کنید، ابتدا تعداد شیفت لازم برای خط آخر محاسبه میشه که 2 هست (برای 2 تا X ی که بالا اضافه میشه)


This is first line
Second line

Third line

بعد خط دوم شیفت داده میشه (1 بایت)


This is first line

Second line

Thhird line

و بعد X ها در جای خالی نوشته میشه:


This is first lineX
Second lineX
Third lineX

موضوع الگوریتمی هست امیدوارم متوجه شده باشید...

s3rv3r
جمعه 13 بهمن 1391, 00:33 صبح
درسته plus عزیز.

با مولتی ترد کردن هم نمیشه کاری از پیش برد چون دسترسی به فایل برای پروسه های ترتیبی هست در این باره چه کار باید کرد؟؟

plus
جمعه 13 بهمن 1391, 02:12 صبح
زیاد کردن thread سرعتی به کار نمیده، چیزی که باعث کندی میشه، کم بودن سرعت هارد، مموری و بعد cpu برای این کار هست.شما هرچقدر هم thread اضافه کنی چیزی به سرعت cpu اضافه نمیشه.
با همون یک thread میشه این کار رو انجام داد.به طور تخمینی توی روش اول مقدار جابجایی بر حسب بایت از (O(M x N هست (M تعداد بایت ها و N تعداد سطر ها) ولی روشی که گفتم، از (O(M هست یعنی به طور متوسط به انداز نوشتن یک فایل با اندازه فایلتون، زمانگیر هست.

s3rv3r
جمعه 13 بهمن 1391, 21:02 عصر
ممنون دوس عزیز .

خیلی سنگینه فکر کنم یه ده هزار سال طول بشکه

اگه بخوام تمام پسورد های ممکنه روهم با 95 کاراکتر

string mychar1 = "0123456789abcdefghijklmnopqrstuvwxyz?!@#$%^&*()~";//48
string mychar2 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN OPQRSTUVWXYZ`-=[]\';/.,\\|<>?:\"|{}+_)(*&^%$#@!~";//95

تولید کنم هم همین مشکل به وجود میاد
من یه لیست پسوردی داشتم به تعداد یک میلیارد عدد
میخواستم با اضافه کردن کاراکتر ها به اولش تعداد بیشتری تولید کنم که ظاهرا خیلی زمان بره