Поскольку вы выполняете только слияние, а не полную сортировку, это просто основной цикл слияния. Чисто последовательный ввод / вывод. Не нужно беспокоиться о буферах. Изобразите молнию на жакете. Это так просто. (Примечание: это может быть намного быстрее, если числа в файлах представлены в двоичном формате. Мало того, что файлы будут меньше, но программа будет ограничена вводом / выводом, а числа будут совершенно точными.)
double GetNumberFromFile(FILE file){
if (feof(file)){
return BIGBIGNUMBER;
}
else {
return ReadADouble(file);
}
}
double A = GetNumberFromFile(AFILE);
double B = GetNumberFromFile(BFILE);
while (A < BIGBIGNUMBER && B < BIGBIGNUMBER){
if (A < B){
write A;
A = GetNumberFromFile(AFILE);
}
else if (B < A){
write B;
B = GetNumberFromFile(BFILE);
}
else {
write A;
write B; // or not, if you want to eliminate duplicates
A = GetNumberFromFile(AFILE);
B = GetNumberFromFile(BFILE);
}
}
while (A < BIGBIGNUMBER){
write A;
A = GetNumberFromFile(AFILE);
}
while (B < BIGBIGNUMBER){
write B;
B = GetNumberFromFile(BFILE);
}
Отвечая на ваш вопрос, рассмотрим более простую проблему, копируя один файл в другой. Вы выполняете только последовательный ввод-вывод, в котором файловая система действительно хороша. Вы пишете простой цикл для чтения небольших файлов, таких как байт или int, из файла, и записываете его в другой. Как только вы пытаетесь прочитать байт, система выделяет хороший большой буфер, удаляет большой кусок файла в буфер и затем выдает вам байт из буфера. Он продолжает делать это до тех пор, пока вам не понадобится еще один буфер, когда он незаметно покажет другой для вас. То же самое происходит с файлом, который вы пишете. Теперь процессор довольно быстрый, поэтому он может перебирать входные байты, копируя их в выходные данные, за долю времени, которое требуется для чтения или записи буфера, потому что чтение или запись не могут выполняться быстрее, чем внешнее оборудование. Единственная причина, по которой мог бы помочь больший буфер, состоит в том, что часть времени чтения / записи - это то, что называется «задержкой», то есть, по сути, временем, которое требуется, чтобы переместить головку на желаемую дорожку и дождаться появления желаемого сектора. Большинство файловых систем разбивают файлы на куски, которые разбросаны по всему диску, поэтому голова все равно прыгает. Вы можете услышать это.
Единственная разница между копированием и алгоритмом слияния, как у вас, заключается в том, что он читает два файла, а не один. В любом случае, базовая временная последовательность представляет собой серию операций чтения и записи в буфер, перемежающихся с небольшим количеством действий процессора. (Можно выполнить перекрывающийся ввод / вывод, чтобы действие ЦП имело место , в то время как происходит ввод / вывод, поэтому в основном задержка не буфер читает и записывает, но это было больше, когда процессоры были в 1000 раз медленнее.)
Конечно, если вы можете организовать это так, чтобы все файлы для чтения и записи находились на отдельных физических дисках, а диски не сильно фрагментировались, то объем движения головки мог бы быть минимизирован, и большие буферы могли бы помочь , Но в основном, с простой программой, вы можете ожидать, что простой код будет работать так же быстро, как диск может перемещать данные, и гигантские буферы могут помочь, но не сильно.