У меня есть этот большой (и странно отформатированный txt файл) из веб-сайта USDA. Это файл NUT_DATA.txt.
Но проблема в том, что это почти 27 Мб! Мне удалось импортировать несколько других меньших файлов, но мой метод использовал file_get_contents
, что имеет смысл, почему возникает ошибка, если я попытаюсь захватить 27 МБ ОЗУ.
Итак, как я могу импортировать этот массивный файл в мою базу данных MySQL без использования тайм-аута и проблемы с RAM? Я попытался просто получить одну строку за раз из файла, но это столкнулось с проблемой тайм-аута.
Использование PHP 5.2.0.
Вот старый script (поля в БД - это просто цифры, потому что я не мог понять, какое количество представляло, что такое питательное вещество, я нашел эти данные очень плохо документированным. Извините за уродство кода):
<?
$file = "NUT_DATA.txt";
$data = split("\n", file_get_contents($file)); // split each line
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("database", $link);
for($i = 0, $e = sizeof($data); $i < $e; $i++)
{
$sql = "INSERT INTO `USDA` (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) VALUES(";
$row = split("\^", trim($data[$i])); // split each line by carrot
for ($j = 0, $k = sizeof($row); $j < $k; $j++) {
$val = trim($row[$j], '~');
$val = (empty($val)) ? 0 : $val;
$sql .= ((empty($val)) ? 0 : $val) . ','; // this gets rid of those tildas and replaces empty strings with 0s
}
$sql = rtrim($sql, ',') . ");";
mysql_query($sql) or die(mysql_error()); // query the db
}
echo "Finished inserting data into database.\n";
mysql_close($link);
?>
Если вам нужно использовать PHP, вы можете прочитать файл строки за строкой, используя fopen
и fgets
<?
$file = "NUT_DATA.txt";
$fh = @fopen( $file, "r" ); // open the file for reading
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("database", $link);
while( !feof( $fh ) )
{
$data = fgets( $fh, 4096 ); // read line from file
$sql = "INSERT INTO `USDA` (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) VALUES(";
$row = split("\^", trim($data)); // split each line by carrot
for ($j = 0, $k = sizeof($row); $j < $k; $j++) {
$val = trim($row[$j], '~');
$val = (empty($val)) ? 0 : $val;
$sql .= ((empty($val)) ? 0 : $val) . ','; // this gets rid of those tildas and replaces empty strings with 0s
}
$sql = rtrim($sql, ',') . ");";
mysql_query($sql) or die(mysql_error()); // query the db
}
echo "Finished inserting data into database.\n";
fclose( $fh );
mysql_close($link);
?>
За дополнительной информацией обратитесь к документации fgets
Прочитайте файл по строкам, чтобы не загружать весь файл в память. Используйте
set_time_limit(0);
Чтобы избежать тайм-аута script.
Вы можете увеличить объем памяти, который может использовать каждый script, установив это значение в php.ini
:
memory_limit = 64M
Сказав это: вам нужно использовать PHP? другие языки сценариев (например, python) могут быть более подходящими для таких задач.