Импорт большого файла с разделителями в таблицу MySQL - PullRequest
0 голосов
/ 13 июня 2010

У меня есть этот большой (и странно отформатированный текстовый файл) с сайта *1002* Министерства сельского хозяйства США. Это файл NUT_DATA.txt.

Но проблема в том, что это почти 27 МБ! Мне удалось импортировать несколько других файлов меньшего размера, но мой метод использовал file_get_contents, что имеет смысл, если будет выдано сообщение об ошибке, если я попытаюсь получить более 27 МБ ОЗУ.

Так, как я могу импортировать этот массивный файл в мою MySQL DB, не сталкиваясь с проблемой тайм-аута и оперативной памяти? Я пытался получить только одну строку из файла, но это вызвало проблему тайм-аута.

Использование PHP 5.2.0.

Вот старый сценарий (поля в БД являются просто числами, потому что я не мог выяснить, какое число представляет какое питательное вещество, я нашел эти данные очень плохо документально. Извините за уродливость кода):

<?

    $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);

?>

Ответы [ 3 ]

2 голосов
/ 13 июня 2010

Если вам нужно использовать 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);

?>

Проверьте документацию для получения дополнительной информации

1 голос
/ 13 июня 2010

Читайте файл построчно, чтобы не загружать весь файл в память.Используйте

set_time_limit(0);

, чтобы избежать тайм-аута вашего скрипта.

http://php.net/manual/en/function.set-time-limit.php

0 голосов
/ 13 июня 2010

Вы можете увеличить объем памяти, который может использовать каждый скрипт, установив это значение в php.ini:

memory_limit = 64M  

Сказав это: у вас есть для использования PHP? другие языки сценариев (например, python) могут быть более подходящими для такого рода задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...