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

  • Автор темы Автор темы elakeri
  • Дата начала Дата начала

elakeri

Client
Регистрация
23.07.2018
Сообщения
203
Реакции
10
Баллы
18
Не подскажет кто нить, как организовать работу в несколько потоков, чтоб каждый поток брал только свой номер, список от 1 до 500кк нереально сделать )))
Спасибо
 
Не подскажет кто нить, как организовать работу в несколько потоков, чтоб каждый поток брал только свой номер, список от 1 до 500кк нереально сделать )))
Спасибо
Именно 500 кк (500 млн) или все же 500.000?
Если первое, то можно за приемлемые сроки (минут 30) сгенерить файл с числами и как посоветовал @Phoenix78 брать из него числа с удалением. Если 500 млн, то конечно генерация будет подольше. :-)
 
Последнее редактирование:
за приемлемые сроки (минут 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".
 
Последнее редактирование:
Именно 500 кк (500 млн) или все же 500.000?
Если первое, то можно за приемлемые сроки (минут 30) сгенерить файл с числами и как посоветовал @Phoenix78 брать из него числа с удалением. Если 500 млн, то конечно генерация будет подольше. :-)
500млн.., пробовал файл создать не получилось )), где то на 50млн оперативу всю сожрало (16гг)
 
Почему так долго? 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млн потянул, потом кирдык
 
Если нужно порядковый номер (когда в новом запросе нужен номер на еденицу больше прошлого) то можно или сделать список с 1 значением и в коде С (делать лок файла, брать значение, увеличивать на 1 и записывать, снимать лок) но данный код должен быть перед самым запросом, ну или тоже самое только с базой данних)
 
Если нужно порядковый номер (когда в новом запросе нужен номер на еденицу больше прошлого) то можно или сделать список с 1 значением и в коде С (делать лок файла, брать значение, увеличивать на 1 и записывать, снимать лок) но данный код должен быть перед самым запросом, ну или тоже самое только с базой данних)
если так, то проще глобальную переменную залочить и там счетчик организовать.
 
а можно другой код? ))), этим сразу пробовал, 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);
}
 
Почему именно список? На 10кк уже > 75мб файл.
По уму надо хранить только текущий номер. Как выше подсказали - лочить файл или делать транзакцию в базе. Плюс, на случай сбойных запросов вести лог ошибок, чтобы вернуться к нему позднее.
 
Спасибо всем, попробую что нибудь ))
 
Почему именно список? На 10кк уже > 75мб файл.
По уму надо хранить только текущий номер. Как выше подсказали - лочить файл или делать транзакцию в базе. Плюс, на случай сбойных запросов вести лог ошибок, чтобы вернуться к нему позднее.

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

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