Сколько строк из списка Зенка может переварить не подавившись?

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
3 месяца скорее уйдет, а не 3 дня
Это уже детали

в книгах уже давно все разжевано
В книгах многое чего разжёвано. Однако, я не видел ещё книги, в которой было бы хоть что-то про работу Зенно
Второе,- ты говоришь про книги, в которых это уже разжёвано, а вот мне такие не попадались. Другим также, наверное.
Например, на Западе студенты платят денежку профессорам и друг другу за "библиографию" (список книг на определённую тему).
Так что, знать название книг, то есть "где и куда копать" тоже многое значит
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
есть одно но, в книгах стараются писать правильно, а не понятно. поэтому статьи бывают гораздо доступнее, чем изложение в книгах
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
в книгах стараются писать правильно, а не понятно
Золотые слова. Книги по программированию, пишут-то в основном для роботов, или для тех, у кого мозги как у робота.
Всё приходится додумывать самому
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
есть одно но, в книгах стараются писать правильно, а не понятно. поэтому статьи бывают гораздо доступнее, чем изложение в книгах
Каждый понимает текст по-своему, а в книгах пишут текстом, который представляет из себя компромисс между сжатостью, правильностью изложения, понятностью и простотой. Если пытаться то же самое расписывать самому, то текст увеличится в раза 2. Но по многопоточности чтобы все понять надо прочитать нескольких популярных авторов и их подход к многопотоку. Плюс видео посмотреть различное и статьи на хабре ещё почитать, так что со временем можно во всем разобраться.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Если пытаться то же самое расписывать самому, то текст увеличится в раза 2.
Смотря кто и как пишет. Если излагаемый вопрос или тему я хорошо знаю, я всегда смогу объяснить его в нескольких фразах. Доступно и понятно

Но по многопоточности чтобы все понять надо прочитать нескольких популярных авторов и их подход к многопотоку.
Не подходил ещё к данной теме.

Плюс видео посмотреть различное и статьи на хабре ещё почитать, так что со временем можно во всем разобраться.
Да, точно. Всегда и во всём можно разобраться. С годами, говорят, всё приходит (или проходит? :()
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
понимание приходит не с годами, а через практику. надо пропустить через пальцы как минимум три задачки по одной теме, ну подсматривать кое-когда, но стараться запоминать основное, а в конце самому себе задачку придумать и выполнить, придумать задачку обычно тяжелее чем выполнить. И в программировании не хватает именно задачников с решениями
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

zhekan3

Client
Регистрация
27.12.2015
Сообщения
31
Благодарностей
4
Баллы
8
Он со скрежетом на больших файлах работать и будет, да еще и в один поток только.

Замените код на такой, будет намного быстрее обрабатывать:
C#:
string[] first = File.ReadAllLines(@"c:\file1.txt");
string[] second = File.ReadAllLines(@"c:\file2.txt");
string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
File.WriteAllLines(@"c:\file2.txt", third);
Дальше, для ускорения, надо делать оптимизацию исходя из конкретики.
Подскажите пожалуйста, как такое же сделать, но со списками? Как исправить код?
Заранее благодарен.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113

zhekan3

Client
Регистрация
27.12.2015
Сообщения
31
Благодарностей
4
Баллы
8
ничего исправлять не надо - всё идеально
я имею ввиду - если списки привязаны к проекту, то как изменить код, чтобы в коде был не путь к фалу, а именно список
  1. string[] first = File.ReadAllLines(project.Lists["Listfirst"]);
  2. string[] second = File.ReadAllLines(project.Lists["Listsecond"]);
  3. string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
  4. File.WriteAllLines(project.Lists["Listsecond"]);
если так изменить, то не работает... подскажите как правильно указать список?
 

zhekan3

Client
Регистрация
27.12.2015
Сообщения
31
Благодарностей
4
Баллы
8
Он со скрежетом на больших файлах работать и будет, да еще и в один поток только.

Замените код на такой, будет намного быстрее обрабатывать:
C#:
string[] first = File.ReadAllLines(@"c:\file1.txt");
string[] second = File.ReadAllLines(@"c:\file2.txt");
string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
File.WriteAllLines(@"c:\file2.txt", third);
Дальше, для ускорения, надо делать оптимизацию исходя из конкретики.
Спасибо за код, полностью рабочий. Подскажите пожалуйста, что сделать чтобы не выскакивала ошибка в многопотоке - "Процесс не может получить доступ к файлу так как этот файл используется другим процессом". В один поток все нормально, а когда больше одного иногда выдает эту ошибку.
Прошу помощи. Заранее благодарен.
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Спасибо за код, полностью рабочий. Подскажите пожалуйста, что сделать чтобы не выскакивала ошибка в многопотоке - "Процесс не может получить доступ к файлу так как этот файл используется другим процессом". В один поток все нормально, а когда больше одного иногда выдает эту ошибку.
Прошу помощи. Заранее благодарен.
C#:
lock(SyncObjects.ListSyncer){
    string[] first = File.ReadAllLines(@"c:\file1.txt");
    string[] second = File.ReadAllLines(@"c:\file2.txt");
    string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
    File.WriteAllLines(@"c:\file2.txt", third);
}
Только не понятно зачем это, т.к. файл и так обрабатывается в многопотоке, средствами c#, а используя блокировку, мы другие потоки будем заставлять ожидать свой очереди, и более многопоточного многопотока (во сказанул) не получится. :-)
 

zhekan3

Client
Регистрация
27.12.2015
Сообщения
31
Благодарностей
4
Баллы
8
C#:
lock(SyncObjects.ListSyncer){
    string[] first = File.ReadAllLines(@"c:\file1.txt");
    string[] second = File.ReadAllLines(@"c:\file2.txt");
    string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
    File.WriteAllLines(@"c:\file2.txt", third);
}
Только не понятно зачем это, т.к. файл и так обрабатывается в многопотоке, средствами c#, а используя блокировку, мы другие потоки будем заставлять ожидать свой очереди, и более многопоточного многопотока (во сказанул) не получится. :-)
Спасибо за ответы, все решил через выход по ошибочной ветке из кубика.
 

zhekan3

Client
Регистрация
27.12.2015
Сообщения
31
Благодарностей
4
Баллы
8
C#:
lock(SyncObjects.ListSyncer){
    string[] first = File.ReadAllLines(@"c:\file1.txt");
    string[] second = File.ReadAllLines(@"c:\file2.txt");
    string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
    File.WriteAllLines(@"c:\file2.txt", third);
}
Только не понятно зачем это, т.к. файл и так обрабатывается в многопотоке, средствами c#, а используя блокировку, мы другие потоки будем заставлять ожидать свой очереди, и более многопоточного многопотока (во сказанул) не получится. :-)
Еще появился вопрос в процессе. Код удалят только полностью одинаковые строки. Как сделать чтобы удалял по части строки, например сейчас удаляет только точное вхождение строки такое как http://сайт. но не удалит строку http://сайт.ру, т.е. строка http://сайт. и http://сайт.ру вроде одинакова но ее не удаляет. Не пойму как сделать поиск по части строки. Заранее всем спасибо.
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
83
Баллы
28
Он со скрежетом на больших файлах работать и будет, да еще и в один поток только.

Замените код на такой, будет намного быстрее обрабатывать:
C#:
string[] first = File.ReadAllLines(@"c:\file1.txt");
string[] second = File.ReadAllLines(@"c:\file2.txt");
string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
File.WriteAllLines(@"c:\file2.txt", third);
Дальше, для ускорения, надо делать оптимизацию исходя из конкретики.
Я правильно понял, что этот код может удалить из файла 2 всё, что есть в файле 1?
 

alexsandroid

Client
Регистрация
06.08.2018
Сообщения
95
Благодарностей
29
Баллы
18
C#:
string[] first = File.ReadAllLines(@"c:\file1.txt");
string[] second = File.ReadAllLines(@"c:\file2.txt");
string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
File.WriteAllLines(@"c:\file2.txt", third);
А если нужно чтобы в результате сохранялась такая же последовательность строк как и в исходных данных?
Так будет правильно?
Код:
string[] first = File.ReadAllLines(@"c:\file1.txt");
string[] second = File.ReadAllLines(@"c:\file2.txt");
string[] third = second.AsParallel().AsOrdered().Except(first.AsParallel().AsOrdered()).ToArray();
File.WriteAllLines(@"c:\file3.txt", third);
Наверное я тут вообще не в тему, т.к. у мне нужно сравнивать списки в которых всего лишь 30 строк.
 

irving zisman

Client
Регистрация
18.05.2017
Сообщения
226
Благодарностей
28
Баллы
28
Друзья, а как можно ускорить вот этот код......
К примеру таблицу из 9000 строк он обрабатывает минуты 3, это очень долго и по моим меркам таблица маленькая, в задачах стоит обрабатывать в среднем по 100-500к строк.

Поясню что делает код: Есть таблица с двумя столбиками, нам нужен только первый столбец, берем оттуда первую строку, и сравниваем с каждой последующей, если находится дубль, удаляем. Когда дошли до последний строки, берем вторую строку и делаем все тоже самое, затем третью и тд.


C#:
IZennoTable table = project.Tables["base"];

lock (SyncObjects.TableSyncer)
{
for (int i = 0; i < table.RowCount; i++)
{
    for (int j = i + 1; j < table.RowCount; j++)
    {
        if (table.GetCell("A", i) == table.GetCell("A", j))
        {
            table.DeleteRow(j); j--;
        }
    }
}
}
Не обязательно работать именно с таблицей, можно все эти данные занести в список, но тогда нужно учитывать, что все что идет после разделителя "." нам не важно. (образно это будет столбец B)
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 562
Благодарностей
9 176
Баллы
113
Друзья, а как можно ускорить вот этот код......
К примеру таблицу из 9000 строк он обрабатывает минуты 3, это очень долго и по моим меркам таблица маленькая, в задачах стоит обрабатывать в среднем по 100-500к строк.

Поясню что делает код: Есть таблица с двумя столбиками, нам нужен только первый столбец, берем оттуда первую строку, и сравниваем с каждой последующей, если находится дубль, удаляем. Когда дошли до последний строки, берем вторую строку и делаем все тоже самое, затем третью и тд.


C#:
IZennoTable table = project.Tables["base"];

lock (SyncObjects.TableSyncer)
{
for (int i = 0; i < table.RowCount; i++)
{
    for (int j = i + 1; j < table.RowCount; j++)
    {
        if (table.GetCell("A", i) == table.GetCell("A", j))
        {
            table.DeleteRow(j); j--;
        }
    }
}
}
Не обязательно работать именно с таблицей, можно все эти данные занести в список, но тогда нужно учитывать, что все что идет после разделителя "." нам не важно. (образно это будет столбец B)
Попробуйте на вашей таблице протестировать стандартный кубик удаления дублей, может быть он будет быстрее обрабатывать.

59678
 
  • Спасибо
Реакции: irving zisman

irving zisman

Client
Регистрация
18.05.2017
Сообщения
226
Благодарностей
28
Баллы
28
@sergodjan66 Спасибо! Что-то я в дебри полез и не подумал о таком простом способе, работает отлично, пару секунд и таблица в 350к строк почистилась!
Но заметил странность, этот метод не удалил все дубли, какие-то остались, только после второго запуска, спустя 3 секунды, все до конца почистилось. Это не глюк, проверил на четырех базах. Возможно причина в том, что перед этим эта база была привязана к списку, затем я ее привязываю к таблице.

ЗЫ Проверил сейчас без привязки в списку, все ок, в этом проблема была
 
  • Спасибо
Реакции: Sergodjan

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 562
Благодарностей
9 176
Баллы
113

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)