Разбіраем вялікі тэкставы файл з Perl збой пры запуску з PHP

Я выкарыстоўваю скрыпт Perl для разбору і стварэння вываду JSON для выкарыстання ў PHP.

У асноўным я з вялікімі тэкставымі файламі (5-20MB) з дапамогай Perl, з дадзенымі наступным чынам:

XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP

Скрыпт выводзіць JSON выснову кожнага радка дадзеных з файла:

{ "1" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP", "2": ... } 

Калі бег ад тэрмінала, ён ідзе больш 100000 радкоў такога файла ў 1,5 секунды, паспяхова ствараючы JSON.

Але калі я запускаю скрыпт у PHP з дапамогай

exec("/usr/bin/perl script.pl input_file.txt",$output);
print_r(json_decode($output[0],true);

ён разбіўся. Хоць, калі я даю гэта файл з 2000-3000 лініямі, ён добра працуе. Не выкарыстоўваючы json_decode і толькі робіць var_dump зменнай $ вываду працуе добра.

Я мяркую, што ён павінен рабіць з json_decode.

Ці ёсць іншы спосаб зрабіць гэта? Прапановы? Рашэнні?

пастскрыптум Я павялічыў PHP memory_limit да 128 МБ.

Дзякуй.

<�Моцны> EDIT:

Сцэнар Perl:

#!/usr/bin/perl -w

use strict;
use warnings;

my $file = $ARGV[0];
my $id = 0;

open my $info, $file or die "Could not open $file: $!";

print "{";
while( my $line = <$info>)  {

    print "\"$id\" : " . "\"" . trim($line) . "\"";

    print ',' unless eof;

    $id++;
}
print "}";

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;        
}

close $info;
0
Разбіце канал на часткі. Не так шмат можна сказаць, не гледзячы на ​​сцэнар.
дададзена аўтар devnull, крыніца
PHP можа быць удушша з-за ўсёй JSON, знаходзячыся ў адным радку. Паспрабуйце замяніўшы друк '' калі EOF; з друк "\ п", калі EOF;
дададзена аўтар devnull, крыніца
PHP можа быць удушша з-за ўсёй JSON, знаходзячыся ў адным радку. Паспрабуйце замяніўшы друк '' калі EOF; з друк "\ п", калі EOF;
дададзена аўтар devnull, крыніца
PHP можа быць удушша з-за ўсёй JSON, знаходзячыся ў адным радку. Паспрабуйце замяніўшы друк '' калі EOF; з друк "\ п", калі EOF;
дададзена аўтар devnull, крыніца
Разбіце канал на часткі. Не так шмат можна сказаць, не гледзячы на ​​сцэнар.
дададзена аўтар devnull, крыніца
Разбіце канал на часткі. Не так шмат можна сказаць, не гледзячы на ​​сцэнар.
дададзена аўтар devnull, крыніца
@ MarkoAleksić я не згодны з вамі .... хутчэй, залежыць ад вашага падыходу упэўнены, што я магу прыдумаць PHP код, які 200% хутчэй, чым ваш PERL падыход да файла, як вялікі, як 100MB
дададзена аўтар Baba, крыніца
@ MarkoAleksić я не згодны з вамі .... хутчэй, залежыць ад вашага падыходу упэўнены, што я магу прыдумаць PHP код, які 200% хутчэй, чым ваш PERL падыход да файла, як вялікі, як 100MB
дададзена аўтар Baba, крыніца
@ MarkoAleksić я не згодны з вамі .... хутчэй, залежыць ад вашага падыходу упэўнены, што я магу прыдумаць PHP код, які 200% хутчэй, чым ваш PERL падыход да файла, як вялікі, як 100MB
дададзена аўтар Baba, крыніца
Чаму вы хочаце, каб разабраць JSON у Perl , калі вы можаце зрабіць гэта ў PHP
дададзена аўтар Baba, крыніца
Чаму вы хочаце, каб разабраць JSON у Perl , калі вы можаце зрабіць гэта ў PHP
дададзена аўтар Baba, крыніца
Чаму вы хочаце, каб разабраць JSON у Perl , калі вы можаце зрабіць гэта ў PHP
дададзена аўтар Baba, крыніца
C @ Натан, я перазапусціць. > Devnull. Я думаў пра такое рашэнне, але не ведаю, як так як я глядзеў з дапамогай Perl ўчора.
дададзена аўтар Marko Aleksić, крыніца
Я адкінуў ідэю сінтаксічнага аналізу ў JSON, а затым дэкадавання назад у масіў. Я проста выхад кожнай абразаецца лініі ад Perl да $ вываду масіва ў PHP. Памылка знікла пасля фіксацыі memory_limit. Я змяняў іншы файл php.ini. (Новы карыстальнік Mac, які я).
дададзена аўтар Marko Aleksić, крыніца
Я адкінуў ідэю сінтаксічнага аналізу ў JSON, а затым дэкадавання назад у масіў. Я проста выхад кожнай абразаецца лініі ад Perl да $ вываду масіва ў PHP. Памылка знікла пасля фіксацыі memory_limit. Я змяняў іншы файл php.ini. (Новы карыстальнік Mac, які я).
дададзена аўтар Marko Aleksić, крыніца
Я адкінуў ідэю сінтаксічнага аналізу ў JSON, а затым дэкадавання назад у масіў. Я проста выхад кожнай абразаецца лініі ад Perl да $ вываду масіва ў PHP. Памылка знікла пасля фіксацыі memory_limit. Я змяняў іншы файл php.ini. (Новы карыстальнік Mac, які я).
дададзена аўтар Marko Aleksić, крыніца
@Baba Я ведаю, што магу зрабіць гэта ў PHP, але зроблена ў Perl працаваць значна хутчэй у маім выпадку.
дададзена аўтар Marko Aleksić, крыніца
@Baba Я ведаю, што магу зрабіць гэта ў PHP, але зроблена ў Perl працаваць значна хутчэй у маім выпадку.
дададзена аўтар Marko Aleksić, крыніца
@Baba Я ведаю, што магу зрабіць гэта ў PHP, але зроблена ў Perl працаваць значна хутчэй у маім выпадку.
дададзена аўтар Marko Aleksić, крыніца
C @ Натан, я перазапусціць. > Devnull. Я думаў пра такое рашэнне, але не ведаю, як так як я глядзеў з дапамогай Perl ўчора.
дададзена аўтар Marko Aleksić, крыніца
C @ Натан, я перазапусціць. > Devnull. Я думаў пра такое рашэнне, але не ведаю, як так як я глядзеў з дапамогай Perl ўчора.
дададзена аўтар Marko Aleksić, крыніца
Я зусім забыўся пра файлы часопіса. Гэта выхад з апошняга запуску: [23-May-2013 14:18:06 Europe/Berlin] PHP Фатальная памылка: Дазволеныя памяці памерам 33.554.432 байт вычарпаныя (спрабавалі вылучыць 72 байт) у/Applications/MAMP/HTDOCS/perl_parser/reader.php на лініі 10
дададзена аўтар Marko Aleksić, крыніца
Я зусім забыўся пра файлы часопіса. Гэта выхад з апошняга запуску: [23-May-2013 14:18:06 Europe/Berlin] PHP Фатальная памылка: Дазволеныя памяці памерам 33.554.432 байт вычарпаныя (спрабавалі вылучыць 72 байт) у/Applications/MAMP/HTDOCS/perl_parser/reader.php на лініі 10
дададзена аўтар Marko Aleksić, крыніца
Я зусім забыўся пра файлы часопіса. Гэта выхад з апошняга запуску: [23-May-2013 14:18:06 Europe/Berlin] PHP Фатальная памылка: Дазволеныя памяці памерам 33.554.432 байт вычарпаныя (спрабавалі вылучыць 72 байт) у/Applications/MAMP/HTDOCS/perl_parser/reader.php на лініі 10
дададзена аўтар Marko Aleksić, крыніца
Калі я запускаю яго з кансолі, не показывает нічога. калі я запускаю яго з браўзэра і зрабіць print_r (json_decode ($ выхад [0], правда)); - паказвае "Памылка сервера" HTTP 500.
дададзена аўтар Marko Aleksić, крыніца
Калі я запускаю яго з кансолі, не показывает нічога. калі я запускаю яго з браўзэра і зрабіць print_r (json_decode ($ выхад [0], правда)); - паказвае "Памылка сервера" HTTP 500.
дададзена аўтар Marko Aleksić, крыніца
Якія памылкі ў PHP вы атрымліваеце?
дададзена аўтар Nathan C, крыніца
Вы ўсё яшчэ не хапае памяці. Вам трэба падзяліць сцэнар на часткі або далейшае павелічэнне ліміту. Вы зрабілі рэстарт апача пры першым павялічыўшы яго да 128 МБ, правільна?
дададзена аўтар Nathan C, крыніца
Вы ўсё яшчэ не хапае памяці. Вам трэба падзяліць сцэнар на часткі або далейшае павелічэнне ліміту. Вы зрабілі рэстарт апача пры першым павялічыўшы яго да 128 МБ, правільна?
дададзена аўтар Nathan C, крыніца
Вы ўсё яшчэ не хапае памяці. Вам трэба падзяліць сцэнар на часткі або далейшае павелічэнне ліміту. Вы зрабілі рэстарт апача пры першым павялічыўшы яго да 128 МБ, правільна?
дададзена аўтар Nathan C, крыніца
А як наконт вашага часопіса памылак?
дададзена аўтар Nathan C, крыніца
А як наконт вашага часопіса памылак?
дададзена аўтар Nathan C, крыніца
А як наконт вашага часопіса памылак?
дададзена аўтар Nathan C, крыніца
Якія памылкі ў PHP вы атрымліваеце?
дададзена аўтар Nathan C, крыніца

8 адказы

Памылка, падобна, у файле php.ini. Гэта кантралюе мноства наладжвальных параметраў для вашай ўстаноўкі PHP. Пытанне для вас, хутчэй за ўсё, наступнае:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1M

Гэта проста прыклад. Але гэта, здаецца, так, што ваш мяжа памяці шлях малы. Паспрабуйце павялічыць яго да чаго-то значна больш, каб убачыць, калі гэта ліквідуе праблему. Як наступнае:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 56M

Таксама зьвярніце ўвагу, што ў любы час вы змяніць свой INI файл, вы павінны перазапусціць PHP сервер, каб ініцыятыве змяніліся быць ужытыя. Гэта лёгкі крок, каб забыцца і можа прывесці да сур'ёзнага расчаравання.

1
дададзена
Звярніце ўвагу, што вы будзеце шукаць свой INI файл для празь memory_limit = , але не дрэнная ідэя, каб прачытаць ўвесь ваш ініцыятыве файл, каб убачыць, што там.
дададзена аўтар usumoio, крыніца

Памылка, падобна, у файле php.ini. Гэта кантралюе мноства наладжвальных параметраў для вашай ўстаноўкі PHP. Пытанне для вас, хутчэй за ўсё, наступнае:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1M

Гэта проста прыклад. Але гэта, здаецца, так, што ваш мяжа памяці шлях малы. Паспрабуйце павялічыць яго да чаго-то значна больш, каб убачыць, калі гэта ліквідуе праблему. Як наступнае:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 56M

Таксама зьвярніце ўвагу, што ў любы час вы змяніць свой INI файл, вы павінны перазапусціць PHP сервер, каб ініцыятыве змяніліся быць ужытыя. Гэта лёгкі крок, каб забыцца і можа прывесці да сур'ёзнага расчаравання.

1
дададзена
Звярніце ўвагу, што вы будзеце шукаць свой INI файл для празь memory_limit = , але не дрэнная ідэя, каб прачытаць ўвесь ваш ініцыятыве файл, каб убачыць, што там.
дададзена аўтар usumoio, крыніца

Памылка, падобна, у файле php.ini. Гэта кантралюе мноства наладжвальных параметраў для вашай ўстаноўкі PHP. Пытанне для вас, хутчэй за ўсё, наступнае:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1M

Гэта проста прыклад. Але гэта, здаецца, так, што ваш мяжа памяці шлях малы. Паспрабуйце павялічыць яго да чаго-то значна больш, каб убачыць, калі гэта ліквідуе праблему. Як наступнае:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 56M

Таксама зьвярніце ўвагу, што ў любы час вы змяніць свой INI файл, вы павінны перазапусціць PHP сервер, каб ініцыятыве змяніліся быць ужытыя. Гэта лёгкі крок, каб забыцца і можа прывесці да сур'ёзнага расчаравання.

1
дададзена
Звярніце ўвагу, што вы будзеце шукаць свой INI файл для празь memory_limit = , але не дрэнная ідэя, каб прачытаць ўвесь ваш ініцыятыве файл, каб убачыць, што там.
дададзена аўтар usumoio, крыніца

Я думаю, што гэта можа быць зроблена ў чыстым PHP , але я б проста засяродзіцца на памылкі вы маеце

The Reason you got Server Error" HTTP 500. is because you did not enable error reporting. trying switching on error reporting you would find out that $выхад returns empty array so $выхад[0] is not valid see PHP call class in class returns error:500

Пры працы з ехес пераканайцеся, што вы карыстаецеся поўны шлях

$buid = 'FULL PATH TO /script.pl' ;
$input = 'FULL PATH TO /input_file.txt' ;

exec("$buid $input",$выхад);
print_r($выхад);

выхад

Array
(
    [0] => Ok{"0" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","1" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","2" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","3" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP"}
)

You don't need /usr/bin/perl in your exec because your script already starts with #!/usr/bin/perl -w

1
дададзена

Я думаю, што гэта можа быць зроблена ў чыстым PHP , але я б проста засяродзіцца на памылкі вы маеце

The Reason you got Server Error" HTTP 500. is because you did not enable error reporting. trying switching on error reporting you would find out that $выхад returns empty array so $выхад[0] is not valid see PHP call class in class returns error:500

Пры працы з ехес пераканайцеся, што вы карыстаецеся поўны шлях

$buid = 'FULL PATH TO /script.pl' ;
$input = 'FULL PATH TO /input_file.txt' ;

exec("$buid $input",$выхад);
print_r($выхад);

выхад

Array
(
    [0] => Ok{"0" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","1" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","2" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","3" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP"}
)

You don't need /usr/bin/perl in your exec because your script already starts with #!/usr/bin/perl -w

1
дададзена

Калі ён працуе з кансолі памылка ляжыць у вашым PHP-канфігурацыі. Гэта можа быць усё, то памылка канфігурацыі ад сцэнара-выканання тайм-аўту ў памяці пытанні або права выканання сцэнара. У вашым выпадку я б паручыцца за некаторыя тайм-аўт або выканання таго, што адбываецца сцэнара права, у залежнасці ад таго, колькі часу патрабуецца, каб ўрэзацца. Праверце PHP-памылкі-часопіс для дэталяў ...

1
дададзена

Калі ён працуе з кансолі памылка ляжыць у вашым PHP-канфігурацыі. Гэта можа быць усё, то памылка канфігурацыі ад сцэнара-выканання тайм-аўту ў памяці пытанні або права выканання сцэнара. У вашым выпадку я б паручыцца за некаторыя тайм-аўт або выканання таго, што адбываецца сцэнара права, у залежнасці ад таго, колькі часу патрабуецца, каб ўрэзацца. Праверце PHP-памылкі-часопіс для дэталяў ...

1
дададзена

Калі ён працуе з кансолі памылка ляжыць у вашым PHP-канфігурацыі. Гэта можа быць усё, то памылка канфігурацыі ад сцэнара-выканання тайм-аўту ў памяці пытанні або права выканання сцэнара. У вашым выпадку я б паручыцца за некаторыя тайм-аўт або выканання таго, што адбываецца сцэнара права, у залежнасці ад таго, колькі часу патрабуецца, каб ўрэзацца. Праверце PHP-памылкі-часопіс для дэталяў ...

1
дададзена