devspec
@devspec
Помогло? Отметь решением

Как сравнить два массива и оставить только совпадающие данные, не загружая массивы в память?

Здравствуйте

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

Спасибо.
  • Вопрос задан
  • 321 просмотр
Решения вопроса 1
@ar4ebaldello
Если значения действительно разные, отсортированные по возрастанию и размер у них 4 байта:
var stream1 = new BinaryReader(File.OpenRead("someFile1.bin"));
var stream2 = new BinaryReader(File.OpenRead("someFile2.bin"));
var output = new BinaryWriter(File.OpenWrite("output.bin"));

if (stream1.PeekChar() != -1 && stream2.PeekChar() != -1)
{
    var val1 = stream1.ReadInt32();
    var val2 = stream2.ReadInt32();

    while (true)
    {
        if (val1 == val2)
        {
            output.Write(val1);

            if (stream1.PeekChar() == -1 || stream2.PeekChar() == -1) break;
            val1 = stream1.ReadInt32();
            val2 = stream2.ReadInt32();
        }
        else if (val1 < val2)
        {
            if (stream1.PeekChar() == -1) break;
            val1 = stream1.ReadInt32();
        }
        else
        {
            if (stream2.PeekChar() == -1) break;
            val2 = stream2.ReadInt32();
        }
    }
}

stream1.Close();
stream2.Close();
output.Close();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер
Ха. Ха ха. Ха ха ха. А как, простите, они сравниваться будут? На логической схеме диска? Ну можно читать по четыре байта (если речь идёт об int), обращаться как к int'у, сравнивать и записывать если одинаковые, передвигаясь дальше, иначе наибольшее оставляем.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы