брать порядковый номер до 500кк в несколько потоков, чтоб не пересекались

elakeri

Client
Регистрация
23.07.2018
Сообщения
199
Благодарностей
10
Баллы
18
Не подскажет кто нить, как организовать работу в несколько потоков, чтоб каждый поток брал только свой номер, список от 1 до 500кк нереально сделать )))
Спасибо
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
Не подскажет кто нить, как организовать работу в несколько потоков, чтоб каждый поток брал только свой номер, список от 1 до 500кк нереально сделать )))
Спасибо
Именно 500 кк (500 млн) или все же 500.000?
Если первое, то можно за приемлемые сроки (минут 30) сгенерить файл с числами и как посоветовал @Phoenix78 брать из него числа с удалением. Если 500 млн, то конечно генерация будет подольше. :-)
 
Последнее редактирование:

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
за приемлемые сроки (минут 30) сгенерить файл с числами
Почему так долго? 500 тыс почти моментально

C#:
if (!File.Exists(project.Directory + @"\id.txt")){

    List<string> lstId = new List<string>();

    for (int i=1;i<500001;i++){

        lstId.Add(i.ToString());

    }

    System.IO.File.WriteAllLines(project.Directory + @"\id.txt",lstId);

}
500 млн, тут уже другим кодом нужно, текущим только если памяти хватает, иначе будет
Выполнение действия CSharp OwnCode Выдано исключение типа "System.OutOfMemoryException".
 
Последнее редактирование:

elakeri

Client
Регистрация
23.07.2018
Сообщения
199
Благодарностей
10
Баллы
18
Именно 500 кк (500 млн) или все же 500.000?
Если первое, то можно за приемлемые сроки (минут 30) сгенерить файл с числами и как посоветовал @Phoenix78 брать из него числа с удалением. Если 500 млн, то конечно генерация будет подольше. :-)
500млн.., пробовал файл создать не получилось )), где то на 50млн оперативу всю сожрало (16гг)
 

elakeri

Client
Регистрация
23.07.2018
Сообщения
199
Благодарностей
10
Баллы
18
Почему так долго? 500 тыс почти моментально

C#:
if (!File.Exists(project.Directory + @"\id.txt")){

    List<string> lstId = new List<string>();

    for (int i=1;i<500001;i++){

        lstId.Add(i.ToString());

    }

    System.IO.File.WriteAllLines(project.Directory + @"\id.txt",lstId);

}
500 млн, тут уже другим кодом нужно, текущим только если памяти хватает, иначе будет
Выполнение действия CSharp OwnCode Выдано исключение типа "System.OutOfMemoryException".
а можно другой код? ))), этим сразу пробовал, 50млн потянул, потом кирдык
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

alex1988

Client
Регистрация
13.07.2014
Сообщения
379
Благодарностей
157
Баллы
43
Если нужно порядковый номер (когда в новом запросе нужен номер на еденицу больше прошлого) то можно или сделать список с 1 значением и в коде С (делать лок файла, брать значение, увеличивать на 1 и записывать, снимать лок) но данный код должен быть перед самым запросом, ну или тоже самое только с базой данних)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Если нужно порядковый номер (когда в новом запросе нужен номер на еденицу больше прошлого) то можно или сделать список с 1 значением и в коде С (делать лок файла, брать значение, увеличивать на 1 и записывать, снимать лок) но данный код должен быть перед самым запросом, ну или тоже самое только с базой данних)
если так, то проще глобальную переменную залочить и там счетчик организовать.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
а можно другой код? ))), этим сразу пробовал, 50млн потянул, потом кирдык
Создать то можно. Только как потом это файл открыть.))
C#:
var path = project.Directory + @"\id.txt";

File.WriteAllText(path, ""); // перезаписываем файл или создаем новый

for (int j = 0; j < 500; j++)
{
    var lstId = new List<string>();

    for (int i = 1; i <= 1000000; i++)
    {
        var value = j * 1000000 + i;
        lstId.Add(value.ToString());
    }

    File.AppendAllLines(path, lstId);
}
 

Sergodjan

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

capturis

Client
Регистрация
21.12.2013
Сообщения
41
Благодарностей
19
Баллы
8
Почему именно список? На 10кк уже > 75мб файл.
По уму надо хранить только текущий номер. Как выше подсказали - лочить файл или делать транзакцию в базе. Плюс, на случай сбойных запросов вести лог ошибок, чтобы вернуться к нему позднее.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
разбить на 1000 файлов. каждый поток работает с одним файлом
 

elakeri

Client
Регистрация
23.07.2018
Сообщения
199
Благодарностей
10
Баллы
18
Спасибо всем, попробую что нибудь ))
 

NNzet

Client
Регистрация
26.01.2014
Сообщения
114
Благодарностей
29
Баллы
28
Почему именно список? На 10кк уже > 75мб файл.
По уму надо хранить только текущий номер. Как выше подсказали - лочить файл или делать транзакцию в базе. Плюс, на случай сбойных запросов вести лог ошибок, чтобы вернуться к нему позднее.
Я вот думал думал и не додумал. Есть у меня 50 потоков каждый должен брать случайное число из 500кк записей с удалением из этого списка.
В базу такое не засунешь как и в список.
 

capturis

Client
Регистрация
21.12.2013
Сообщения
41
Благодарностей
19
Баллы
8
Я вот думал думал и не додумал. Есть у меня 50 потоков каждый должен брать случайное число из 500кк записей с удалением из этого списка.
В базу такое не засунешь как и в список.
Как это в базу не засунешь? Базы могут содержать данные сотнями терабайтов.
Что касается рандома, если нужны все номера просто в случайном порядке - единственное решение сгенерить диапазон и перемешать. Потом положить в базу с полями таблицы `id` и `number` где id - автоинкремент, а number соответственно число из сгенерированного списка. Плюс сделать табличку с единственным значением - id из первой таблицы. Соответственно при очередном запросе блокируем вторую таблицу, читаем id, читаем число из первой таблицы, делаем во второй таблице +1, снимаем блокировку. Можно обойтись и глобальной переменной, но при проблемах придется начинать сначала.
 

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