
Taras ?
15.01.2017
21:03:34
нет, в произвольном порядке

Dmitry
15.01.2017
21:04:34
Впринципе влазит в оперативку 2 файлы или нет?

Taras ?
15.01.2017
21:04:40
не понимаю где я туплю — файлы весят по 155Мб, а оперативки у меня бим-ом кушается 1.5Гб++ пока не упадет...

Dmitry
15.01.2017
21:05:18
Мне кажется для этой задачи эликсир не нужен

Google

Dmitry
15.01.2017
21:05:52
Scipy раскатает за минуту такое

Taras ?
15.01.2017
21:05:55
да можно и на php, вопрос в другом — где я туплю используя erlang/elixir ?
падает когда прошло около 3тис строк
проблема мои кривых рук, не языка, верно? что я делаю не так?

Dmitry
15.01.2017
21:08:13
Эта задача рекурсией никак не решается

Alexander
15.01.2017
21:09:38
зачем строки разбивать на составляющие, если можно целиком строки сравнивать?

Taras ?
15.01.2017
21:10:17

Alexander
15.01.2017
21:10:40
Загнать первый файл целиком построчно(поайдишно) в ets и поудалять из ets строки, которые встретятся во втором файле

Dmitry
15.01.2017
21:10:55

Taras ?
15.01.2017
21:11:26
Эта задача рекурсией никак не решается
перед этим я делал так -
https://gist.github.com/221V/f10c1d5beddc92c5e593cd4e412d77c9
падало на 2тис строк
сейчас вот я сделал открытие 2го файла сразу — теперь падает на 3 тис строк — уже оптимизация, прогресс

Dmitry
15.01.2017
21:12:21
Можно даж не в ets

Taras ?
15.01.2017
21:12:28

Google

Dmitry
15.01.2017
21:12:48
Список медленный теоретически

Alexander
15.01.2017
21:12:56
резутльтат - объединение остатков ets и ненайденых строк из второго файла

Dmitry
15.01.2017
21:12:58
Но по памяти скорее всего не упадёт

Taras ?
15.01.2017
21:14:53
? мне на локалке "в 1 юзера", это не на сервере)
сейчас попробую
а потом и с ets наверное - еще не работал с ними?

Dima
15.01.2017
21:34:33
https://www.youtube.com/watch?v=KPNSHvgROzc

Alexander
15.01.2017
21:39:37
Если ищем разницу только в city_id, то можно из файлов построить упорядоченные списки и вычесть один из другого и наоборот. http://erlang.org/doc/man/ordsets.html#subtract-2

Александр
15.01.2017
21:46:15

anton
15.01.2017
22:13:23
а айдишники какие? гуиды?

Taras ?
15.01.2017
22:33:23

Alexander
15.01.2017
22:43:03
https://gist.github.com/onokhov/f65c179b98dcf480d0472d489241b8f0

Aldar
15.01.2017
22:48:46

Alexander
15.01.2017
22:49:32
> в одном файле русский, в другом - инглиш
там не строки сравнивать надо

anton
15.01.2017
22:55:51
ну задачу можно по разному решать, оптимизируя по памяти, IO и cpu
если речь о том, когда оба массива данных (из файлов)
не помещяются в памяти, то можно следующим способом:
перезаписываем файлы, отсортировав по id (это ведь int, значит можно сортировать по возрастанию например)
далее читаем каждый файл построчно, последовательно
если A == B - идем дальше
если A > B, то берем следующее значение из B и сравниваем с А, записав В куда-то в файл С (ну или вывести куда-то, ведь нас различие интересует)
ой

Alexander
15.01.2017
22:59:29
файлы по 150мегов, из которых нужны не строки, а только одна колонка в каждой строке. Конечно всё поместится в память

anton
15.01.2017
23:01:51
ну тогда считать из каждого файла по нужной колонке из каждой строки в два массива (для каждого файла по массиву)
а потом что-то вроде [1, 2, 3] — [1, 3]
iex> [1, 2, 3] — [1, 3]
[2]
ну через ETS
а redbeard покинул нас однако :(

Dmitry
15.01.2017
23:07:19
Хрень какая то. Почему нужно решать проблему через жопу?
Import pandas as pd
Pd.from_csv(file1)
Pd.from_csv(file2)
pd.merge(df2, df1, how='left')
Конец

Google

Dmitry
15.01.2017
23:07:41
4 строчки в питоне - нет, ща будем мутить алгоритмы в эликсире

anton
15.01.2017
23:08:11
и ему иммутабельные листы мешают ;)

Александр
15.01.2017
23:08:58
там множества есть в эрланге
пусть все айдишники загрузит и так же вычтет

Dmitry
15.01.2017
23:26:40
Я в общем то не против алгоритмов как таковых, просто тут как в анекдоте "шашечки или ехать". Вся фишка data science на питоне в том, что он сделан, отлажен, есть мощные доки и можно решить проблему.
Ну и конечно сделан на C)

anton
15.01.2017
23:40:55
ну если про питон и про решение задачи в лоб, то найти именно различие между двумя массивами можно в одну строку уложить :)
diff = [item for item in temp1 if item not in temp2]
пандовый merge с how='left' немного не то

Dmitry
15.01.2017
23:43:21

anton
15.01.2017
23:43:33
хм. панда просто так не умеет full outer join with exclusion делать.. эх

Alexander
16.01.2017
01:05:19

Taras ?
16.01.2017
01:26:39
я мог сделать это с помощью php или js (phantom.js)
хотелось сделать именно на erlang/elixir — научиться еще чему-то новому — расширение кругозора, мосговый штурм...
благодарямс всем за помощь!
приятно осознавать что день не зря прошел и что-то новое сделано и понято ?

Alexander
16.01.2017
01:28:11
если тебе 2 файла сравнить

Taras ?
16.01.2017
01:29:02
там то же самое можно сделать — считать с файла по-строчно, сравнить...
кстати самое простое решение — импортировать данные в базу, и поиск-сравнение уже силами самой субд сделать — с кода просто запросы в цыкле накидать и все)

Alexander
16.01.2017
01:33:44
я честно не стал бы даже жопу морщить программированием
grep -v -F -x -f file1 file2

Google

Alexander
16.01.2017
01:35:45
у нас в проекте импорты из файлов по 600мб, все жмем зипом и из рубей греп запускаем через пайп к зипу
чтобы даже не использовать место под хранение

Taras ?
16.01.2017
01:36:19

Alexander
16.01.2017
01:36:43
это сравнние 2х файлов и вывод разницы в консоль
работает как пулемет, если особенно ripgrep
можешь прямо из эликсира запускать и просто аутпут забирать
он чистый, прямо твои строки

Taras ?
16.01.2017
01:41:48
? запишу в файлик на будущее)

Admin
ERROR: S client not available

Vladimir
16.01.2017
03:33:35
+1 за греп. Erlang ports не зря придумали.
Каждой задаче свой инструмент.

Rafkat
16.01.2017
04:37:50
Был же прикол, чувак для обработки csv заюзал шелл скрипты вместо хадуп, Мап редьюсер и тд,икоторые были в проекте

Alexander
16.01.2017
04:47:31
я юзаю шелскрипты для первичной обработки csv
чтобы фиксить всякие переносы, кривые разделители
т.е язык программирование 100 раз упадет на ошибках либы, которая парсит csv
grep + sed + awk

Rustam
16.01.2017
04:49:58
grep + sed + awk
сисадминам нахер не нужно программирование, потому что есть шелл))

Alexander
16.01.2017
04:50:28
дело в том, чтобы загнать еще в хадуп данные, нужно их нормализировать, если есть опасение, что они кривые
хадупы-хуюпы
у нас импортеры падали по несколько раз в день, т.к каждый шлет свой csv, где ошибки от кривых либ идут. Где-то джавой делали, там внезапно по паре переносов строк. Еще одни кренделя какой-то индусской либой для c# воспользовались и там святой рандом откусывал разделители

Google

Alexander
16.01.2017
04:53:25
чтобы не патчить по 100 раз импортеры, просто данные до этого еще прогоняем и исправляем из шелскрипта
накипело
надеюсь никого не обидел )

Alexander
16.01.2017
06:53:41
перл ок
perl -lnE '$f //= $ARGV; $ARGV eq $f ? $h{$_}++ : (exists $h{$_} or say)' cities2.txt cities1.txt

Alexander
16.01.2017
07:06:25

Alexander
16.01.2017
07:07:30
для конкретно этой задачи медленнее.
понятно ли почему?

Marat
16.01.2017
07:25:45

Alexander
16.01.2017
07:47:25

Alexander
16.01.2017
08:28:23
потому что сложность grep -v -F -x -f file1 file2 O(n*m), где n - число строк в первом файле, m - во втором. Для каждой строки из одного файла мы пробегаемся по всем строкам другого. Кроме того, греп ищет вхождение подстроки, что медленнее простого сравнения
Для решения на перле сложность O(n+m) - на больших n и m разница по скорости будет огромна

Константин
16.01.2017
08:30:08
если сравнение только по id - то я думаю о сортировке

Dmitry
16.01.2017
08:33:31
Всю жизнь мечтал понимать О нотацию, потому что учился на тракториста и там такому не учат.
Короче спецом закончил курс на степике - теперь довольный как слон)

anton
16.01.2017
08:35:07
пишу с таксофона вам. но разве задача найти каких значений из файла В нет в файле А?
вроде нужно найти те, которые есть в А, но нет в В и нет в А, но есть в В.
для [1,2,3,5] и [6,2,8,1] надо вернуть [3,5,6,8]?

Alexander
16.01.2017
08:36:20
да, и грепом это надо было бы делать в два захода

anton
16.01.2017
08:37:02

Константин
16.01.2017
08:37:02
тут только отсортировать и построчно сравнивать

Alexander
16.01.2017
08:37:30
и не просто список разницы нужен, а два списка, что есть своего в каждом файле
> тут только отсортировать и построчно сравнивать
нет же. Я там выше привел пример на перле. Строки первого файла загоняются в хэш, строки второго проверяются на наличие в хэше

anton
16.01.2017
08:45:00
а эти города и их айдишники не из базы взяты? может их можно сравнить там? откуда файл пришел? :)

abc
16.01.2017
10:51:15