Multi-threaded копирование

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

Если копировать файлы при помощи несколько тредов, то на SSD и не очень больших файлах это дает скорость лучше во многие разы. Есть планы добавить такую фичу в фар?
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Multi-threaded копирование

Post by Yegor »

Last edited by Yegor on Tue 04 Oct, 2022 00:10, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

Yegor wrote: Tue 04 Oct, 2022 00:05Robocopy?
А не лучше добавить фичу собственно в фар, чем делать подпорки?
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Multi-threaded копирование

Post by Yegor »

Вам нужно Multi-threaded копирование, кому-то фоновое, кому-то текстовый редактор, а кому-то встроенного GTA не хватает. Что, все в Фар запихивать?
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

Yegor wrote: Tue 04 Oct, 2022 00:35 Вам нужно Multi-threaded копирование, кому-то фоновое, кому-то текстовый редактор, а кому-то встроенного GTA не хватает. Что, все в Фар запихивать?
Так текстовый редактор уже есть ведь.
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Multi-threaded копирование

Post by Yegor »

CodeMonkey wrote: Tue 04 Oct, 2022 01:22 Так текстовый редактор уже есть ведь.
Ну кому-то не хватает, например, fold/unfold, intellisense. И, конечно же, им нужно это в Фаре, а не плагинами или макросами.
Last edited by Yegor on Tue 04 Oct, 2022 05:35, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

Yegor wrote: Tue 04 Oct, 2022 05:34 Ну кому-то не хватает, например, fold/unfold, intellisense. И, конечно же, им нужно это в Фаре, а не плагинами или макросами.
Плохая аналогия.
Тут, собственно говоря, выбор простой - либо копировать быстро, либо медленно. Я не вижу никаких аргументов в пользу второго варианта, кроме лени и кое-какерства.
2useven10
Posts: 5226
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 314 times

Multi-threaded копирование

Post by 2useven10 »

CodeMonkey wrote: Tue 04 Oct, 2022 06:29 Я не вижу никаких аргументов в пользу второго варианта, кроме лени и кое-какерства.
Надеюсь, вы покажете как надо, или почитайте о себе в правилах форума.

Вообще были люди, которые не только говорили, был (даже есть) плагин FileCopyEx.
Но заброшен, глючный и как ни странно медленный.
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

В порядке эксперимента, сравнил копирование 3 ГБ небольших файлов. В фаре это занимает 40 секунд, а при копировании в 32 треда - 8.69 секунд. Итого, в 4.5 раза быстрее.
Но если хотите назло бабушке сделать медленно, то отговорить конечно не получится.
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Multi-threaded копирование

Post by Yegor »

Разве с тем что это быстрее, кто-то спорит? Есть пара вариантов решения. Задача добавления в Фар такого функционала - нетривиальная (представьте, что в 32-х потоках вам нужно спросить пользователя о перезаписи какого-то файла или произошла какая-то ошибка).

Считаете задачу тривиальной - исходники открыты.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

Yegor wrote: Wed 05 Oct, 2022 05:06 представьте, что в 32-х потоках вам нужно спросить пользователя о перезаписи какого-то файла или произошла какая-то ошибка
Проверить список всех файлов перед началом копирования, никаких проблем.
Да и вообще, не помешала бы опция "перезаписывать всегда" в диалоге в самом начале.
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Multi-threaded копирование

Post by HaRT »

CodeMonkey wrote: Wed 05 Oct, 2022 16:39 не помешала бы опция "перезаписывать всегда" в диалоге в самом начале
Вы не поверите, она там есть, просто надо повнимательнее смотреть.
CodeMonkey wrote: Wed 05 Oct, 2022 16:39 Проверить список всех файлов перед началом копирования, никаких проблем.
Нет практической возможности предвидеть все ошибки, которые могут возникнуть в ходе копирования. (Примеры: копируем на сетевой диск, и отвалилась сеть; запись обломилась из-за физического сбоя носителя; и т.д.)
Разумеется, можно придумать нормальные способы со всем этим разобраться, но, как уже было отмечено выше, задача эта нетривиальная, и до сих пор желающих это должным образом добавить в Фаре (или хотя бы починить в плагине FileCopyEx) не нашлось, в т.ч. среди тех, кто очень настойчиво требует.
Фар есть инструмент, а не нянька. © 2009 DrKnS
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

HaRT wrote: Wed 05 Oct, 2022 17:13 Вы не поверите, она там есть, просто надо повнимательнее смотреть.
Плохо, когда надо смотреть очень внимательно.
HaRT wrote: Wed 05 Oct, 2022 17:13 Нет практической возможности предвидеть все ошибки, которые могут возникнуть в ходе копирования. (Примеры: копируем на сетевой диск, и отвалилась сеть; запись обломилась из-за физического сбоя носителя; и т.д.)
Ну ок, произошла ошибка. Если это не ожидаемая ошибка типа уже существующего или заблокированного файла, просто прекращаем все операции и спрашиваем.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Multi-threaded копирование

Post by zg »

CodeMonkey wrote: Wed 05 Oct, 2022 00:28 В порядке эксперимента, сравнил копирование 3 ГБ небольших файлов. В фаре это занимает 40 секунд, а при копировании в 32 треда - 8.69 секунд. Итого, в 4.5 раза быстрее.
Но если хотите назло бабушке сделать медленно, то отговорить конечно не получится.
код, используемый для тестирования, можно посмотреть?
CodeMonkey
Posts: 62
Joined: Thu 14 Jul, 2016 11:17
Has thanked: 12 times

Multi-threaded копирование

Post by CodeMonkey »

zg wrote: Wed 05 Oct, 2022 21:38 код, используемый для тестирования, можно посмотреть?
А это что-то изменит?

Code: Select all

class Program
{
	static void Main(string[] args)
	{
		var sourcePath = args[0];
		var targetPath = args[1];

	var size = 0L;
	var count = 0;
	var sync = new object();

	var watch = Stopwatch.StartNew();
	var files = new DirectoryInfo(sourcePath).EnumerateFiles("*", SearchOption.AllDirectories);

	Parallel.ForEach(files, new() { MaxDegreeOfParallelism = 32, },
		file =>
		{
			var source = file.FullName;
			var relative = source[sourcePath.Length..];
			var target = @$"{targetPath}\{relative}";
			var targetDir = Path.GetDirectoryName(target);
			Directory.CreateDirectory(targetDir);
			File.Copy(source, target, true);

			lock (sync)
			{
				count++;
				size += file.Length;
			}
		});

	watch.Stop();
	Console.WriteLine($"Finished: {watch.Elapsed}, {count}, {size}, {size / watch.Elapsed.TotalSeconds}");
}
}
Finished: 00:00:12.6822642, 85429, 8852283865, 698005003.3179406

Для сравнения, фар на тех же данных потратил 62 секунды. Медленнее в 4.88 раза.
Last edited by CodeMonkey on Fri 07 Oct, 2022 05:30, edited 1 time in total.
Post Reply

Return to “Предложения и идеи”