Форум программистов, компьютерный форум CyberForum.ru

Нужен совет !На что заменить гиганский массив - C++

Восстановить пароль Регистрация
 
HoseMose
1 / 1 / 0
Регистрация: 27.08.2013
Сообщений: 82
18.09.2013, 10:03     Нужен совет !На что заменить гиганский массив #1
Добрый день , пишу Рекурсивный обходчик каталогов под linux. К примеру есть каталог /var/ и нужно получить все его подкаталоги и каталоги подкаталогв. В итоге имею массив свыше 100 тыс. строк . На что программа естественно ругается. В голову приходит мысль записи во временный файл. Правильно ли будет это ? Так как с начало придется записать первый уровень каталогов в файл а потом их считать для дальнейшей обработки , и так далее. Целесообразны ли затраты времени на эту функцию?.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 10:03     Нужен совет !На что заменить гиганский массив
Посмотрите здесь:

Двумерные массив(с++).практически получилась.нужен совет. C++
C++ нужен совет!!!
Нужен совет! C++
C++ Нужен совет
Нужен совет! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
18.09.2013, 10:19     Нужен совет !На что заменить гиганский массив #2
Цитата Сообщение от HoseMose Посмотреть сообщение
На что заменить гиганский массив
Бд.
Цитата Сообщение от HoseMose Посмотреть сообщение
В голову приходит мысль записи во временный файл.
Можно еще по частям считывать в массив. Если не нужно все значения сразу иметь, то считать часть, обработать, выгрузить, и считать следующую.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
18.09.2013, 10:24     Нужен совет !На что заменить гиганский массив #3
А если создать несколько массивов? Допустим, отдельно для каталогов, подкаталогов и каталогов подкаталогов.
Всё равно будет свыше 100 тысяч?
HoseMose
1 / 1 / 0
Регистрация: 27.08.2013
Сообщений: 82
18.09.2013, 10:46  [ТС]     Нужен совет !На что заменить гиганский массив #4
Объем Дискового массива 10ТБ. Каталогов там более 1млн.

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Бд.
Можно еще по частям считывать в массив. Если не нужно все значения сразу иметь, то считать часть, обработать, выгрузить, и считать следующую.
Вы меня на вели намысль , создать КЛАСС в катором данный массив будет обрабатыватся и записываться в файл , а далее память будет освобождаться.
Петррр
 Аватар для Петррр
5916 / 3353 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
18.09.2013, 10:46     Нужен совет !На что заменить гиганский массив #5
Писать в файл.
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
18.09.2013, 10:50     Нужен совет !На что заменить гиганский массив #6
если вы используете массив, который не может хранить более 100 тыс. элементов, то конечно разбиение на несколько массивов вас спасет.
но я до конца не понял задачу. надо тупо получить имена всех каталогов, подкаталогов и т.д.?
т.е. без сохранения структуры дерева каталогов?
если так, то зачем такой массив нужен в памяти? тогда уж проще сразу писать в файл и не париться.
если же предполагаются какие-то связи между каталогами, то массивы не лучшее решение, надо стряпать в оперативе какую-то динамическую структуру, дерево.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
18.09.2013, 11:13     Нужен совет !На что заменить гиганский массив #7
я бы не писал в файл а взял базу данных
но если не приемлемо то создал бы дерево файлов
например файл1 корень
в нем имена всех файлов и имена директорий
файл2 лежит первая директория т.е имена директорий которые входят в неё имена файлов
короче получится дерево типа как показывает dir
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
18.09.2013, 11:21     Нужен совет !На что заменить гиганский массив #8
Цитата Сообщение от HoseMose Посмотреть сообщение
пишу Рекурсивный обходчик каталогов под linux. К примеру есть каталог /var/ и нужно получить все его подкаталоги и каталоги подкаталогв.
Есть мнение, что это не полная формулировка задания, HoseMose чего-то недоговаривает. А если все же это полная формулировка - что может быть проще? Тупо рекурсивный обход, пишешь в файл все имена каталогов и подкаталогов, и вуаля!
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.09.2013, 11:54     Нужен совет !На что заменить гиганский массив #9
Вот мой подход:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <fstream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <windows.h>
 
namespace fs = boost::filesystem;
 
void all_files(const fs::path& p, std::ostream& os)
{
    for (fs::directory_iterator pos(p); pos != fs::directory_iterator(); ++pos)
    {
        if (fs::is_directory(*pos))
        {
           os << *pos << std::endl;
           all_files(*pos, os);
        }
    }
}
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
    fs::path directory_path("D://Test");
    std::ofstream ofs("D:/all_files.txt");
    all_files(directory_path, ofs);
 
    std::cout << "\nDone." << std::endl;
    return 0;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
18.09.2013, 12:04     Нужен совет !На что заменить гиганский массив #10
Цитата Сообщение от HoseMose Посмотреть сообщение
Добрый день , пишу Рекурсивный обходчик каталогов под linux. К примеру есть каталог /var/ и нужно получить все его подкаталоги и каталоги подкаталогв. В итоге имею массив свыше 100 тыс. строк . На что программа естественно ругается. В голову приходит мысль записи во временный файл. Правильно ли будет это ? Так как с начало придется записать первый уровень каталогов в файл а потом их считать для дальнейшей обработки , и так далее. Целесообразны ли затраты времени на эту функцию?.
А с какой целью создаётся массив? Т.е. как потом эти данные будут обрабатываться? Мне видится, что файловая система сама по сути является хранилищем данных (хранит имена файлов и каталогов). Вариант с тем, чтобы положить это всё в базу данных, на внешний файл и т.п. принципиально ничем не отличается от того, чтобы читать данные по живому из файловой системы. А потому для ответа на вопрос желательно понимать, чего ты с этой информацией собираешься дальше делать
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,658
Записей в блоге: 1
18.09.2013, 12:16     Нужен совет !На что заменить гиганский массив #11
Цитата Сообщение от HoseMose Посмотреть сообщение
итоге имею массив свыше 100 тыс. строк . На что программа естественно ругается.
А как программа ругается? В VS2010 спокойно создается int массив из 10млн элементов + вектор на 100 млн...
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
18.09.2013, 12:19     Нужен совет !На что заменить гиганский массив #12
Цитата Сообщение от zer0mail Посмотреть сообщение
А как программа ругается?В VS2010 спокойно создается int массив из 10млн элементов
Цитата Сообщение от HoseMose Посмотреть сообщение
В итоге имею массив свыше 100 тыс. строк .
а ты случайно не локальный массив создаешь?
если да то просто стека не хватает
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
18.09.2013, 12:29     Нужен совет !На что заменить гиганский массив #13
Цитата Сообщение от CheshireCat Посмотреть сообщение
HoseMose чего-то недоговаривает.
по ходу хочет таким образом вытащить файловое дерево с удаленного хоста)
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
18.09.2013, 12:32     Нужен совет !На что заменить гиганский массив #14
Цитата Сообщение от Evg Посмотреть сообщение
А с какой целью создаётся массив?
Это вопрос дня.
Tulosba
18.09.2013, 12:52
  #15

Не по теме:

Круто будет наткнуться на какой-нибудь сетевой каталог и выйти на свой же комп. И замкнуться.

HoseMose
1 / 1 / 0
Регистрация: 27.08.2013
Сообщений: 82
18.09.2013, 12:56  [ТС]     Нужен совет !На что заменить гиганский массив #16
Задумка такова! Будет массив с путями всех каталогов в директории. И можно будет сравнить халявную работу демна rsync. Который тупо теряется и всегда записывае только часть файлов. В дальнейшем на свой лад переписать программу и сделать подобие rsync.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2013, 16:37     Нужен совет !На что заменить гиганский массив
Еще ссылки по теме:

C++ Нужен совет
Нужен совет! C++
C++ Нужен совет

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
18.09.2013, 16:37     Нужен совет !На что заменить гиганский массив #17
Цитата Сообщение от HoseMose Посмотреть сообщение
И можно будет сравнить
Если что-то сравнить - то скидывать в файл

Цитата Сообщение от HoseMose Посмотреть сообщение
В дальнейшем на свой лад переписать
Если делать копирование, то нет смысла что-то хранить. Увидел каталог в src, создал каталог в dst. Увидел файл в src - скопировал его в dst. Нафига в массиве-то всё хранить?
Yandex
Объявления
18.09.2013, 16:37     Нужен совет !На что заменить гиганский массив
Ответ Создать тему
Опции темы

Текущее время: 10:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru