@Staasoncheg СПАСИБО. Выручил!
Как быстро удалить строки из списка.
-
Здравствуйте коллеги.
Столкнулся с проблемой.
Хочу при старте программы, в функции OnStart... очистить список 1(1,7 млн строк) от значений из списка 2(130 к строк), что бы затем многопоточно запустить парсинг по тем ссылкам, по которым ранее не парсилось ничего.
Какая сейчас проблема:
Из обоих файлов ссылки закидываю в списки, и в функции foreach перебираю ссылки из списка 2, удаляя каждую из них из списка 1, но это занимает катастрофически много времени. Уверен, что это можно сделать кодом.
Нашел следующий пример на js:let a = [1,2,3,4,5,6,7,8,9,10]; let b = [6,7,10]; let c = a.reduce( (acc, item) => { if (!b.includes(item)) acc.push(item); return acc;} , []); console.log(c);Который на выходе даёт такой результат:
[
1,
2,
3,
4,
5,
8,
9
]Протестировал этот код в кубике, и получил точно такой же результат.
Немного модифицировал код, и протестировал на небольшом объёме ссылок:[[SSILKI_DLYA_OBRABOTKI]] = [[SSILKI_DLYA_OBRABOTKI]].reduce( (acc, item) => { if (![[SPARSHENNIYE_TOVARY]].includes(item)) acc.push(item); return acc;} , []);В изначальном примере было 3 переменных, но в боевом коде решил использовать 2, что бы не плодить их.
На небольшом объёме всё четко и очень быстро сработало.Когда зарядил весь объём, и запустил проект всё к херам зависло, и х.з. как обработать эти огромные списки. При этом ведь они могут в других проектах быть и больше.
Можно конечно пойти другим путем, и просто удалять из ресурса уже спаршенные ссылки, однако хотелось бы иметь возможность действовать именно таким образом.
Подскажете выход?Если нужно, могу приложить проект, и файлы со ссылками, но надеюсь кто-то уже подобную проблему решал, и просто даст образец кода, который всё это быстро обрабатывает, и не приводит к зависанию.
-
@green1987 said in Как быстро удалить строки из списка.:
... кто-то уже подобную проблему решал ...
Решал.
Можно попробовать filter, код не тестировал. Я не очень хорошо знаком с Javascript, не могу знать заранее что быстрее в нем работает. Если движок Javascript перебирает каждый раз урлы во втором массиве(!smallerArray.includes(url);), то будет капец медленно. Если он делает под капотом какие-то оптимизации, есть шанс, что скорость устроит.
// UNTESTED CODE!!! function findUniqueUrls(largerArray, smallerArray) { // Use the 'filter' method on the larger array to find URLs not included in the smaller array let uniqueUrls = largerArray.filter((url) => { // Check if the url is not included in the smallerArray return !smallerArray.includes(url); }); // The 'uniqueUrls' array now contains the URLs from the first array that are not in the second array return uniqueUrls; }Вероятно, стоит посмотреть в сторону Set. Должно быстрее массивов работать.
// UNTESTED CODE!!! function findUniqueUrls(largerArray, smallerArray) { // Convert the smallerArray to a Set for faster lookups let smallerSet = new Set(smallerArray); // Use the 'filter' method on the larger array to find URLs not included in the smallerSet let uniqueUrls = largerArray.filter((url) => { // Very fast // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#performance return !smallerSet.has(url); }); // The 'uniqueUrls' array contains the URLs from the first array that are not in the second array return uniqueUrls; }Я использовал https://man7.org/linux/man-pages/man1/comm.1.html. Утилита решает ровно твою задачу.
DESCRIPTION top Compare sorted files FILE1 and FILE2 line by line. When FILE1 or FILE2 (not both) is -, read standard input. With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines unique to FILE2, and column three contains lines common to both files. =====>-1 suppress column 1 (lines unique to FILE1) <============ =====>-2 suppress column 2 (lines unique to FILE2) <============ -3 suppress column 3 (lines that appear in both files)Под Windows тоже есть.

Еще использовал https://www.datamystic.com/textpipe для обработки гигабайтов текста, работает отлично.
-
@green1987 Во первых, что бы работать с такими большими списками - сразу закройте инспектор переменных, и зависаний будет меньше. Как только отладили код на малых списках - сразу попробуйте в запуске и будет понятно реальное время выполнения без влияния зависания интерфейса редактора.
По коду - лучше используйте просто map, filter или forEach() что бы перебрать список, reduce тут излишне.
Так же лучше действовать наоборот - перебирать меньший список, и искать в большем.что то типа
[[SPARSHENNIYE_TOVARY]].forEach(funtion(el){ var index = [[SSILKI_DLYA_OBRABOTKI]].indexOf(el) if(index >=0){ [[SSILKI_DLYA_OBRABOTKI]].splice(index ,1) } })Но что бы работать с очень большими файлами больше 10млн строк, или даже меньше если данных в самих строках много - лучше использовать сторонние софты