Разбиваем текстовый файл на части - по строкам

12
J
На сайте с 06.07.2011
Offline
169
2825

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

Но никак не может текстовый файл в 50MB разбить на части по строкам, выводит:

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 71 bytes) in /usr/home/2.php on line 2

Сам скрипт:


<?php
$lines = file("file.txt");

$fc = 1;

$lc = 200; // по сколько строк в файле

$fp = fopen("file_1.txt", "a");

for ($i=0; $i<count($lines); $i++)
{
fwrite($fp, $lines[$i]);
if ($i/$lc==floor($i/$lc) and $i!=0)
{
fclose($fp);
$fc += 1;
$fp = fopen("file_".$fc.".txt", "a");
}
}
fclose($fp);
?>
Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

ну увеличьте в php.ini параметр memory_limit если нормально переписать не можете.

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
J
На сайте с 06.07.2011
Offline
169
#2
Оптимизайка:
ну увеличьте в php.ini параметр memory_limit если нормально переписать не можете.

Скажи пожалуйста, а как будет нормально? Код кривой?

DV
На сайте с 01.05.2010
Offline
644
#3

Вам это нужно постоянно, или однократно? В консоли:

# split -l 200 file.txt

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
J
На сайте с 06.07.2011
Offline
169
#4
DenisVS:
Вам это нужно постоянно, или однократно? В консоли:
# split -l 200 file.txt

Однократно

Большое спасибо, но в файлах нет нумерации..

xzy

zsx

такие файлы

а нужно filename1.txt, filename5000.txt и т д

---------- Post added 12-01-2016 at 23:01 ----------

DenisVS:
Вам это нужно постоянно, или однократно? В консоли:
# split -l 200 file.txt

Не работает - пишет:

split: too many files

B
На сайте с 13.02.2008
Offline
262
#5
jano:
$lines = file("file.txt");

Зачем загонять всё сразу в массив? У ПХП массивы жрут весьма много памяти. Используйте построчное чтение из файла.

J
На сайте с 06.07.2011
Offline
169
#6
borisd:
Зачем загонять всё сразу в массив? У ПХП массивы жрут весьма много памяти. Используйте построчное чтение из файла.

Если не сложно, отпиши пожалуйста, что нужно подправить в скрипте, что бы было построчное чтение?

DV
На сайте с 01.05.2010
Offline
644
#7

Кстати, да, не надо "мучить стек", как говорят сишники.

В цикле с помощью fgets отсчитывать нужное количество строк, сбрасывать в новый файл.

Короче, всё надо переписывать :)

[Удален]
#8

на python:


# -*- coding:utf-8 -*-
with open('file.txt') as infile:
counter = 0
for line in infile:
open( 'filename{0}.txt'.format(str( counter / 200 )), 'a' ).write( line )
counter+=1

shell:


split -dl 200 --additional-suffix=.txt file.txt filename
TA
На сайте с 12.06.2009
Offline
116
TiA
#9
jano:
Если не сложно, отпиши пожалуйста, что нужно подправить в скрипте, что бы было построчное чтение?

Например так:


$handle = fopen("file.txt");

$fp = fopen("file_1.txt", "a");

$fc = 1;
$lc = 200;

if ($handle) {

while (($buffer = fgets($handle)) !== false) {

fwrite($fp, $buffer);

if ($i/$lc == floor($i/$lc)) {
fclose($fp);
$fc += 1;
$fp = fopen("file_".$fc.".txt", "a");
}

}

}

fclose($fp);

fclose($handle);

Работать будет значительно быстрее.

Профессиональная верстка и разработка сайтов на WordPress (http://www.maultalk.com/topic139110s0.html)
J
На сайте с 06.07.2011
Offline
169
#10
imagine:
на python:

# -*- coding:utf-8 -*-
with open('file.txt') as infile:
counter = 0
for line in infile:
open( 'filename{0}.txt'.format(str( counter / 200 )), 'a' ).write( line )
counter+=1


shell:

split -dl 200 --additional-suffix=.txt file.txt filename

Большое спасибо, но если команду юзать - выводит ошибку: split: illegal option -- d

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий