LINUX.ORG.RU

ruby: файл в массив строк


0

0

Раскладываю файл в массив строчек: data=File.open(«file.file»){|file| file.read }.collect

Всё ОК, только памяти кушается вдвое больше чем без .collect, т.е. кушается аж двойной размер файла! Это нормально?

Пробовал .collect в переменную и последующее обнуление data, это ничего не дало в плане экономии памяти...


>Всё ОК, только памяти кушается вдвое больше чем без .collect, т.е. кушается аж двойной размер файла! Это нормально?

Подтвердить не могу.

Кстати, вместо этого твоего дурацкого open с блоком можно просто File.read. Так, на всякий случай.

anonymous
()
Ответ на: комментарий от anonymous

> Подтвердить не могу.

Попробуй на файле в сотни МБ. После .read процесс будет занимать в ОЗУ примерно размер указанного файла, а после .map в 2 с лишним раза больше даже если обнулить первую переменную.

И на всякий случай какая версия Руби?

Кстати, вместо этого твоего дурацкого open с блоком можно просто File.read. Так, на всякий случай.

ОК буду знать, просто пользовался той строчкой как готовым «рецептом» чтобы в ОЗУ закачать содержимое файла.

tx
() автор топика
Ответ на: комментарий от tx

>даже если обнулить первую переменную

Это не повод сборщику мусора отдавать память, если он вообще это делает.

Deleted
()
Ответ на: комментарий от tx

>Попробуй на файле в сотни МБ.

Что мне, делать нечего? Большие файлы обрабатываются с помощью итераторов, никто и никогда не будет такие файлы делить на построчные массивы эксплицитно.

После .read процесс будет занимать в ОЗУ примерно размер указанного файла, а после .map в 2 с лишним раза больше даже если обнулить первую переменную.

На большом файле - может быть, ведь ты создаешь еще один объект с таким же содержанием, только в виде массива. File.readlines('filename') что мешает сделать?

anonymous
()
Ответ на: комментарий от anonymous

> Большие файлы обрабатываются с помощью итераторов, никто и никогда не будет такие файлы делить на построчные массивы эксплицитно.

А если надо один файл в несколько потоков обрабатывать?

tx
() автор топика
Ответ на: комментарий от tx

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

anonymous
()
Ответ на: комментарий от anonymous

> если в несколько потоков, то в каждом потоке читается часть файла и обрабатывается. разве не очевидно?

Нет, не очевидно. Куда очевиднее посчитать строчки, поделить кол-во пополам и сделать 2 цикла «for».

в конце-концов, сделай File.readlines('filename') и получишь то что хотел без дублирования и collect.

Оно в память считывает целиком или считал строчку-выплюнул?

tx
() автор топика
Ответ на: комментарий от anonymous

Да, и как предлагается поделить пополам и считать в два буфера текстовый файл, зная максимум его размер? Посчитать половину и дальше вручную сканить на предмет «\n»?

tx
() автор топика
Ответ на: комментарий от anonymous

> File.readlines('filename')

Проверил, оно сразу же отъедает двойной объём памяти, без collect и всего остального. :( Нужно что-то другое...

tx
() автор топика
Ответ на: комментарий от tx

>Проверил, оно сразу же отъедает двойной объём памяти, без collect и всего остального.

Глупости.

anonymous
()
Ответ на: комментарий от anonymous

> Глупости

Проверил же - File.read=300МБ, File.readlines=890МБ.

tx
() автор топика
Ответ на: комментарий от tx

> Куда очевиднее посчитать строчки, поделить кол-во пополам и сделать 2 цикла «for».

Норкоманы в треде! Все в машину!

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.