Есть текстовый файл, содержащий 50 млн строк. Каждая строка представляет из себя 128 чисел разделенных запятыми. Числа дробные, встречаются как положительные так и отрицательные. Повторяющихся строк нет. Пример строки:
0.071292467415333,-0.023935986682773,-0.13865402340889,0.05140496 7904091,0.05167068913579,0.12666814029217,-0.0052258693613112,0.0 97368858754635,-0.03436279669404,0.087945327162743,0.054717376828 194,0.13890127837658,0.05776160210371,-0.13699766993523,-0.039030 574262142,0.024958092719316,0.011621533893049,-0.021428775042295, -0.022057777270675,0.15744969248772,-0.01653153821826,-0.08421389 7585869,0.070698313415051,-0.067558705806732,-0.089225351810455,- 0.079039998352528,-0.020857874304056,-0.093059413135052,-0.170622 92993069,0.0086597679182887,-0.061914071440697,0.056449055671692, 0.041722450405359,0.088787995278835,-0.10962722450495,0.060668248 683214,0.013032994233072,-0.12191165238619,-0.091955155134201,0.0 1702076010406,-0.0036252874415368,-0.12144759297371,0.00069876102 497801,-0.022994702681899,-0.088497273623943,-0.045550908893347,0 .038045510649681,-0.0038571273908019,-0.017954334616661,0.2249206 6025734,0.14239208400249,-0.037806041538715,-0.19742241501808,0.0 3962854668498,0.046822018921375,-0.019383827224374,-0.05829762667 4175,-0.14274616539478,-0.01677187345922,0.14730595052242,-0.0217 35465154052,-0.056886732578278,-0.013830338604748,-0.194291949272 16,0.1320860683918,-0.23630918562412,-0.067043833434582,0.0453966 89325571,-0.079120628535748,0.072182655334473,0.0057500791735947, 0.076287366449833,-0.043940495699644,-0.0075749256648123,-0.09400 1092016697,0.098780125379562,0.13899019360542,0.12156815826893,-0 .058578245341778,0.0055857067927718,-0.10487326234579,-0.16555346 548557,0.00059438205789775,0.11986077576876,-0.078973889350891,0. 11895883083344,0.034543503075838,-0.024633478373289,0.07513050734 9968,0.061008621007204,-0.11152406036854,-0.11672402918339,-0.117 47029423714,0.09415827691555,-0.051639299839735,0.009757210500538 3,0.016125960275531,-0.084737546741962,-0.10686632990837,0.040266 569703817,0.024195179343224,0.033146802335978,-0.087706804275513, -0.01810160279274,0.10377033054829,0.032073490321636,-0.045927692 204714,0.062718726694584,-0.14111457765102,0.067913360893726,-0.1 8303139507771,-0.033415719866753,0.093002498149872,-0.01413680985 57,-0.013297382742167,-0.058300253003836,0.11134455353022,0.00947 98374921083,0.022525005042553,0.17402991652489,-0.015349865891039 ,-0.0068148467689753,0.084242820739746,0.10224357992411,0.1552647 3522186,-0.042886350303888,0.09326608479023,0.033394519239664
Примечание: текстовый файл содержащий 50 млн. таких строк весит примерно 100 Гб.
Помимо файла с 50 млн таких строк, есть еще 1 строка, также содержащая 128 чисел как описано выше, назовем ее "эталонной строкой".
Задача: написать консольную программу (или скрипт) которая будет за 5 секунд находить среди 50 млн строк 20 наиболее "близких" к эталонной и выводить эти 20 строк с сортировкой по степени похожести. Программа должна работать на одной машине (т.е. нельзя распределять нагрузку на несколько машин).
"Близость" двух строк между собой рассчитывается так: представим что, одна строка представляет из себя а1, а2, а3, .... а128, а вторая строка b1, b2, b3, .... b128. Результат сравнения этих 2 строк (Х) находится по формуле: Х = (а1-b1)^2 + (а2-b2)^2 + (а3-b3)^2 + ... + (а128-b128)^2
Исходя из формулы Х всегда положительное число. Чем ближе Х к 0, тем более похожи 2 строки между собой.
Если нужно, для демонстрации результата можем предоставить на 1 сутки любой инстанс на Microsoft Azure
azure.microsoft.com/en-us... а также сами заранее разместим там файл с 50 млн. строк преобразовав его в нужный вам вид (в т.ч. любая БД).
Если вас устраивает цена, но необходимо что-то дополнительно, предлагайте ваши варианты.