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