![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение StringList большого объема в файл [D2005, 2003]
_guest_ © (2013-09-16 16:33:00)Есть StringList с объемом текста в полгига. При попытке сохранить в файл или поток (что в общем то одно и то же) получаю "аут оф мемори", так как SaveTo... пытается сохранить его одним куском. А уже обращение к StringList.Text вызывает эту ошибку. Построчно в текстовый файл - пожалуйста, только времени не один час. Помогите, пожалуйста, буферизировать сохранение в поток. Для меня проблемой является уже даже получить размер результирующей строки. Рассмотрю любые альтернативные варианты. StringList формируется из кусков в количестве от десятков до сотен тысяч размером около 5 килобайт. Можно бы их сразу по получении сливать на диск, но мне перед этим надо их обработать все вместе, а обработка следующих кусков зависит от результатов обработки предыдущих.
Inovet (2013-09-17 10:06:00) [61]> [15] brother © (17.09.13 10:00)
> array of string?
А в чём принципиальная разница? Я понимаю - в БД какую загрузить и её средствами обрабатывать, может быть.
brother (2013-09-17 10:06:00) [62]можно многое, но [16]?
_guest_ (2013-09-17 10:06:00) [63]
> brother © (17.09.13 10:00) [15]
Не думал о массиве. А его можно быстро сохранить, т.е. можно ли получить кусок массива как буфер? Если нет, то в чем собственно выигрыш?
Sha (2013-09-17 10:05:00) [64]> А где же держать данные
до сих пор не ясно, зачем их держать или зачем держать их все
brother (2013-09-17 10:00:00) [65]array of string?
_guest_ (2013-09-17 09:57:00) [66]
> Sha © (17.09.13 09:48) [13]
А где же держать данные, если они в виде списка строк и приходят?
Sha (2013-09-17 09:48:00) [67]> Небольшой анализ, а потом все вывалить в mid он же csv он же просто
> текстовый файл со значениями через какой-нибудь разделитель.
Тогда и свойство Text не нужно, и, вероятно, сам StringList.
_guest_ (2013-09-17 09:19:00) [68]Извините, кнопку "Добавить" нажал один раз. Или мышку менять или указательный палец.
_guest_ (2013-09-17 09:17:00) [69]
> DVM © (16.09.13 18:02) [7]
Да-да. Я в первую очередь FileStream и попробовал, но прироста скорости практически не получил. Очевидно, это обусловлено тем, что строк много, но они короткие типа "имя":"значение". Поэтому при построчной перезаписи преимуществ буферизации почти и нет.
> Юрий Зотов © (16.09.13 19:16) [8]
То есть, и стринглист в памяти, и поток тоже в памяти. То есть, мы копируем здоровенную инфу из одного места памяти в другое место той же памяти. И удивляемся, что получили "аут оф мемори".
Нет. В результате этого действия ошибка не возникает, поэтому и не удивляюсь. И, между нами, даже если я пару-тройку раз растиражирую поток такого объема она не возникает, тормозится при свопинге - это да. Ошибки нет при работе со списком такого объема, она возникает при обращении к StringList.Text см.[1]. И то, что он нормально обрабатывается меня и подвело. Идея, что называется в лоб, была простой: получить строку, выдергивать из нее куски, а уж куда их писать в поток файловый или нет, непосредственно в файл ли - это не принципиально. Куски были бы заметно больше, чем одна строка и сохранение не заняло бы настолько много времени, ведь перезапись файла такого объема никого не шокирует. Я уткнулся в то, что не смог получить доступ к этой строке.
> Sha © (16.09.13 23:42) [9]
> а что именно надо сделать с данными?
Небольшой анализ, а потом все вывалить в mid он же csv он же просто текстовый файл со значениями через какой-нибудь разделитель. Потом аналитики его заберут в Excel или Access или еще куда-то, но требуют именно текстовый файл в виде плоской таблицы.
Я уже понял, что придется данные разбить по кварталам, каждый из них сохранить в свой файл, а после обработки слить в один. Ничего страшного с любой точки зрения в этом нет, на мой взгляд - нормальное решение. Я не очень много знаю о Делфи, вот и решил спросить. может кто-то уже натыкался на такую задачу.
_guest_ (2013-09-17 09:17:00) [70]
> DVM © (16.09.13 18:02) [7]
Да-да. Я в первую очередь FileStream и попробовал, но прироста скорости практически не получил. Очевидно, это обусловлено тем, что строк много, но они короткие типа "имя":"значение". Поэтому при построчной перезаписи преимуществ буферизации почти и нет.
> Юрий Зотов © (16.09.13 19:16) [8]
То есть, и стринглист в памяти, и поток тоже в памяти. То есть, мы копируем здоровенную инфу из одного места памяти в другое место той же памяти. И удивляемся, что получили "аут оф мемори".
Нет. В результате этого действия ошибка не возникает, поэтому и не удивляюсь. И, между нами, даже если я пару-тройку раз растиражирую поток такого объема она не возникает, тормозится при свопинге - это да. Ошибки нет при работе со списком такого объема, она возникает при обращении к StringList.Text см.[1]. И то, что он нормально обрабатывается меня и подвело. Идея, что называется в лоб, была простой: получить строку, выдергивать из нее куски, а уж куда их писать в поток файловый или нет, непосредственно в файл ли - это не принципиально. Куски были бы заметно больше, чем одна строка и сохранение не заняло бы настолько много времени, ведь перезапись файла такого объема никого не шокирует. Я уткнулся в то, что не смог получить доступ к этой строке.
> Sha © (16.09.13 23:42) [9]
> а что именно надо сделать с данными?
Небольшой анализ, а потом все вывалить в mid он же csv он же просто текстовый файл со значениями через какой-нибудь разделитель. Потом аналитики его заберут в Excel или Access или еще куда-то, но требуют именно текстовый файл в виде плоской таблицы.
Я уже понял, что придется данные разбить по кварталам, каждый из них сохранить в свой файл, а после обработки слить в один. Ничего страшного с любой точки зрения в этом нет, на мой взгляд - нормальное решение. Я не очень много знаю о Делфи, вот и решил спросить. может кто-то уже натыкался на такую задачу.
Sha (2013-09-16 23:42:00) [71]> Просто со списком работать немного удобнее
а что именно надо сделать с данными?
Юрий Зотов (2013-09-16 19:16:00) [72]> _guest_ (16.09.13 17:54) [5]
> у меня memoty.
То есть, и стринглист в памяти, и поток тоже в памяти. То есть, мы копируем здоровенную инфу из одного места памяти в другое место той же памяти. И удивляемся, что получили "аут оф мемори".
DVM (2013-09-16 18:02:00) [73]
> _guest_ (16.09.13 17:54) [5]
> А кстати, какого типа поток надо давать на вход TStreamProxy?
> Может я чего впопыхах не понял у меня memoty.
Неееее. TStreamProxy это лишь обертка. Понятно почему у тебя нет ускорения.
Использовать надо так:
BuffStream := TBufferedStream.Create(TFileStream.Create(...), true);
Далее пишешь в BuffStream
_guest_ (2013-09-16 17:58:00) [74]
> DVM © (16.09.13 17:45) [4]
Печально, сейчас 64 бита, но куда поставят прогу, я не знаю. Буду думать.
_guest_ (2013-09-16 17:54:00) [75]
> brother © (16.09.13 17:41) [3]
Какая-то фигня о земельных участках на один район в формате json. Только мне кажется, эта информация не слишком поможет в решении задачи. Скорее всего придется сразу в поток или файл писать Получение данных процесс длительный - от суток и больше, операция сохранения кусками не будет сильно заметной на этом фоне. Просто со списком работать немного удобнее, плюс мне удалось разбить весь процесс на несколько операций, каждая из которых сохраняет свой результат в виде файла, который попадает на вход следующей. В случае каких-либо проблем можно будет начинать не с самого начала, а с той операции, которая не завершилась успешно.
> DVM © (16.09.13 16:56) [1]
К сожалению процесс не слишком ускорился: обработалось чуть больше
1.5 млн. строк за 10 минут. Еще умножаем на 10, плюс за этим само сохранение из потока в файл..., в общем пока ищу дальше. А кстати, какого типа поток надо давать на вход TStreamProxy? Может я чего впопыхах не понял у меня memoty.
DVM (2013-09-16 17:45:00) [76]
> _guest_ (16.09.13 17:22) [2]
Это логи что ли какие? А зачем все в память то грузить было? Просто дело в том, что сейчас оно у тебя влезло, а завтра не влезет и без сохранения даже ты получишь Out Of Memory на 32 бит системе. На 64 не получишь, но будет все тормозить сильно.
brother (2013-09-16 17:41:00) [77]я даже боюсь предположить что там...
_guest_ (2013-09-16 17:22:00) [78]Спасибо, попробую, хотя сомнения и одолевают - больше 14 млн. строк ...
DVM (2013-09-16 16:56:00) [79]Попробуй вот этот буферизованный поток, пиши в него построчно, должно стать быстрее, размер буфера подбери только.
http://pastebin.com/70wj5mTS