Перевод по словарю

Статус
В этой теме нельзя размещать новые ответы.
И в результате для перевода коротенькой статьи в 1000 знаков оно будет делать порядка 150-200 селектов к базе. По-твоему это рациональное использование ресурсов? Или приемлемая скорость работы?
В первом посте указано, что ТС интересует перевод ОДНОГО слова.

А вот тут я вообще запутался. Словарь же не модифицируется вроде. Зачем его копировать? Один раз от памяти отожрать 900кб - никто и не пикнет.
К сожалению, ТС не уточнил с какими целями ему скрипт перевода. Если допустить, что это онлайновый сервис по переводу слова - то в таком случае на 10 конектов от разных юзеров будет 10 копий скрипта в памяти. 10 копий полностью считанного словаря. Против одной базы на мускуле - смотрится очень невыгодно.

Один раз от памяти отожрать 900кб - никто и не пикнет. Даже если 900 метров словарь будет весить, т.е. в тысячу раз больше, чем сейчас - все равно на современных серваках с 4Gb оперативы он все еще влезет в память, и str_replace() нормально отработает.
Снова вынужден отослать к первому посту. ТС спрашивал как лучше сделать, по сравнению с полным считыванием в память. Я объяснил возможные варианты. А в приведенной тут цитате ты предлагаешь как раз оставить как есть. Твой подход имеет право на существование, хотя если честно, я это все же считаю разбазариванием ресурсов. Но ТС, судя по всему, такой подход перестал устраивать - от этого и отталкиваемся.
 
Удивительно, но мне именно сегодня понадобилось переводить по словарику теги с одного буржуйского финансового сайта.
Прилагаю файлик, возможно кому-то окажется полезным.
Если нет - ну и не страшно, проходите мимо.

PHP:
class Translator {
  var $dict = array();
  function Translator($file) {
	$fp = fopen($file,'r');
	while($str = fgets($fp)) {
	    list($en,$ru) = explode(chr(9),$str);
	    $this->dict[trim($en)] = trim($ru);
	}
  } 
  function tr($word) {
	$we = strtolower(trim($word));
	$wr = $this->dict[$we];
	return $wr ? $wr : $we;
  }
}

  $tr = new Translator('finance.txt');

  $xml = file_get_contents('posts.xml');
  $arr = array();
  preg_match_all('|tags="(.*?)"|ms',$xml,$arr);
  foreach($arr[1] as $k => $line) {
      $tags = array();
      foreach(explode(',',$line) as $tag) $tags[] = $tr->tr($tag);
.....

finance.txt - словарик экономической тематики. Формат
word(таб)слово(ентер)
word(таб)слово(ентер)
...
размером 240кб.

Блин, удивительное все же совпадение. Я в шоке.
 
странно, что никому не пришло в голову предложить пропарсить предварительно файл словарика и создать файл(индекс) со словами и их переводов в файлике php ввиде массива.

имхо словарик не так часто редактируется... один раз потратились чуть больше, зато потом катаемся почти бесплатно
 
Даже если 900 метров словарь будет весить, т.е. в тысячу раз больше, чем сейчас - все равно на современных серваках с 4Gb оперативы он все еще влезет в память, и str_replace() нормально отработает.

Но это если у тебя есть соственный сервер..
У меня скрипт работает на обычном шареде.

К сожалению, ТС не уточнил с какими целями ему скрипт перевода.

Это парсер ключевиков, т.е. в итоге мы получаем 200-300 англ. слов, вот их как раз и нужно перевести.
Идеальный вариант, это перевести все слова за 1 заход и выдать пользователю. Но учитывая ограничение на время выполнения скрипта, и остальные прелести шареда - буду переводить по одному слову за раз(будет кнопка "перевести слово").

Вариант с поиском по тестовому файлу работал нормально, особенно если разбить весь словарь на несколько файлов по начальным буквам.
В этом случае каждая копия скрипта загружает свой словарь, в моем понимании это не рационально.

Сейчас перегнал словарь в MySQL и просто выбираю перевод по точному совпадению.

Но в идеале хочу все-таки перевдить все слова за один раз (понятно что на шареде это врядли получиться). Поэтому все еще в поисках оптимального решения.

Добавлено через 5 минут
PHP:
class Translator {
  var $dict = array();
  function Translator($file) {
	$fp = fopen($file,'r');
	while($str = fgets($fp)) {
	    list($en,$ru) = explode(chr(9),$str);
	    $this->dict[trim($en)] = trim($ru);
	}
  } 
  function tr($word) {
	$we = strtolower(trim($word));
	$wr = $this->dict[$we];
	return $wr ? $wr : $we;
  }
}

  $tr = new Translator('finance.txt');

  $xml = file_get_contents('posts.xml');
  $arr = array();
  preg_match_all('|tags="(.*?)"|ms',$xml,$arr);
  foreach($arr[1] as $k => $line) {
      $tags = array();
      foreach(explode(',',$line) as $tag) $tags[] = $tr->tr($tag);
.....

файл не полный
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху