alexey980
Новичок
есть простейшая БД (с одним полем), состоящая из уникальных строковых ключей, типа:
SDPT234ddfs4545FFqsdfs
TXB2ZQ5d
Z0KM4Ob2Ovyd5L1iK946vQ
5729HcIuHcvabd
...
время от времени на сервер приходит пакет новых ключей в виде строки, в которой ключи разделены символом “\n” (или каким-нибудь другим разделителем – это не важно).
во вновь прибывшем пакете может быть от 100 до 3000 ключей.
для каждого нового ключа из входящего пакета нужно проверить, есть ли такой ключ в базе, и если нет, то добавить его в базу.
сейчас для хранения данных используется обычный текстовый файл f.txt, в котором ключи разделены символом “\n”, а для проверки и добавления новых ключей в базу используется следующий сценарий:
сейчас, в базе порядка 30 тысяч ключей, и проблем в работе сценария пока никаких нет.
но что делать, если база со временем разрастется?
для стресс-теста был сгенерирован файл, аналогичный файлу f.txt, но с количеством ключей - 2 млн. (объем файла получился около 40 Мб).
первая же попытка прогнать цикл «проверка-добавление» в массиве из 50-ти новых ключей показала, что сценарий начинает заметно тормозить.
если же массив вновь добавляемых ключей увеличить до 1000, то сценарий встает колом.
в связи с чем возникает вопрос:
как лучше реализовать такую задачу на php?
можно ли что-то придумать здесь быстрее, чем strpos()?
P.S.
в качестве сервера используется домашний ПК /Intel(R) Core(TM)2 Quad CPU Q8200 @2.33GHz 2.34Ghz, ОЗУ 4GB/ под управлением Windows 7 64бит + Denwer 3.
SDPT234ddfs4545FFqsdfs
TXB2ZQ5d
Z0KM4Ob2Ovyd5L1iK946vQ
5729HcIuHcvabd
...
время от времени на сервер приходит пакет новых ключей в виде строки, в которой ключи разделены символом “\n” (или каким-нибудь другим разделителем – это не важно).
во вновь прибывшем пакете может быть от 100 до 3000 ключей.
для каждого нового ключа из входящего пакета нужно проверить, есть ли такой ключ в базе, и если нет, то добавить его в базу.
сейчас для хранения данных используется обычный текстовый файл f.txt, в котором ключи разделены символом “\n”, а для проверки и добавления новых ключей в базу используется следующий сценарий:
PHP:
// считываем содержимое файла с имеющимся ключами в строку целиком
$s = file_get_contents('f.txt', true);
//преобразуем вновь прибывший пакет ключей в массив
$arr = explode("\n", $_POST["newkeys"]);
//подсчитываем количество новых ключей в пакете
$n = count($arr);
// цикл «проверка-добавление» для каждого нового ключа из массива
for ($i=0; $i<$n; $i++){
if ( strpos($s, $arr[$i]) === false){
$s = arr[i]."\n".$s;
}
}
//перезаписываем обновленную строку с ключами в файл
file_put_contents('f.txt', $s);
но что делать, если база со временем разрастется?
для стресс-теста был сгенерирован файл, аналогичный файлу f.txt, но с количеством ключей - 2 млн. (объем файла получился около 40 Мб).
первая же попытка прогнать цикл «проверка-добавление» в массиве из 50-ти новых ключей показала, что сценарий начинает заметно тормозить.
если же массив вновь добавляемых ключей увеличить до 1000, то сценарий встает колом.
в связи с чем возникает вопрос:
как лучше реализовать такую задачу на php?
можно ли что-то придумать здесь быстрее, чем strpos()?
P.S.
в качестве сервера используется домашний ПК /Intel(R) Core(TM)2 Quad CPU Q8200 @2.33GHz 2.34Ghz, ОЗУ 4GB/ под управлением Windows 7 64бит + Denwer 3.