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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
HoseMose
1 / 1 / 0
Регистрация: 27.08.2013
Сообщений: 104
#1

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

18.09.2013, 10:03. Просмотров 519. Ответов 16
Метки нет (Все метки)

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

Нужен совет: что начать изучать? - C++
Привет, форумчане! Когда-то давно, я захотел изучить программирование, и так как эта замечательная идея зародилась в школьные времена, я...

Двумерные массив(с++).практически получилась.нужен совет. - C++
задача гласит так:" Удалить все столбцы, в которых первый элемент больше последнего." я как бы решил но почему то он затирает столбцы,...

Работа со стеком. Если массив нужен float, а не int, что необходимо изменить - C++
#include <iostream> #include <stdlib.h> using namespace std; // ****************СТЕК НА ОСНОВЕ МАССИВА*************** const int N =...

Нужен совет - C++
Вообщем написал программу, вкратце : сущ-ет класс человек, а классы менеджер, рабочий и ученый наследуют его св-ва. Нужно обратиться к...

Нужен совет: - C++
я учусь в 2-ом курсе на программиста у меня есть базовые знание c++,STL до сих пор работал только с консолью,опыта нету что дальше...

Нужен совет - C++
Хочу начать изучать С++. Посоветуйте какие-нибудь книги или самоучители. Учить буду с нуля. До этого немного учил Паскаль, но понял, что...

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

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Бд.
Можно еще по частям считывать в массив. Если не нужно все значения сразу иметь, то считать часть, обработать, выгрузить, и считать следующую.
Вы меня на вели намысль , создать КЛАСС в катором данный массив будет обрабатыватся и записываться в файл , а далее память будет освобождаться.
0
Петррр
5965 / 3402 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
18.09.2013, 10:46 #5
Писать в файл.
1
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
18.09.2013, 10:50 #6
если вы используете массив, который не может хранить более 100 тыс. элементов, то конечно разбиение на несколько массивов вас спасет.
но я до конца не понял задачу. надо тупо получить имена всех каталогов, подкаталогов и т.д.?
т.е. без сохранения структуры дерева каталогов?
если так, то зачем такой массив нужен в памяти? тогда уж проще сразу писать в файл и не париться.
если же предполагаются какие-то связи между каталогами, то массивы не лучшее решение, надо стряпать в оперативе какую-то динамическую структуру, дерево.
1
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,056
18.09.2013, 11:13 #7
я бы не писал в файл а взял базу данных
но если не приемлемо то создал бы дерево файлов
например файл1 корень
в нем имена всех файлов и имена директорий
файл2 лежит первая директория т.е имена директорий которые входят в неё имена файлов
короче получится дерево типа как показывает dir
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
18.09.2013, 11:21 #8
Цитата Сообщение от HoseMose Посмотреть сообщение
пишу Рекурсивный обходчик каталогов под linux. К примеру есть каталог /var/ и нужно получить все его подкаталоги и каталоги подкаталогв.
Есть мнение, что это не полная формулировка задания, HoseMose чего-то недоговаривает. А если все же это полная формулировка - что может быть проще? Тупо рекурсивный обход, пишешь в файл все имена каталогов и подкаталогов, и вуаля!
1
DiffEreD
1431 / 768 / 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;
}
1
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,194
Записей в блоге: 27
18.09.2013, 12:04 #10
Цитата Сообщение от HoseMose Посмотреть сообщение
Добрый день , пишу Рекурсивный обходчик каталогов под linux. К примеру есть каталог /var/ и нужно получить все его подкаталоги и каталоги подкаталогв. В итоге имею массив свыше 100 тыс. строк . На что программа естественно ругается. В голову приходит мысль записи во временный файл. Правильно ли будет это ? Так как с начало придется записать первый уровень каталогов в файл а потом их считать для дальнейшей обработки , и так далее. Целесообразны ли затраты времени на эту функцию?.
А с какой целью создаётся массив? Т.е. как потом эти данные будут обрабатываться? Мне видится, что файловая система сама по сути является хранилищем данных (хранит имена файлов и каталогов). Вариант с тем, чтобы положить это всё в базу данных, на внешний файл и т.п. принципиально ничем не отличается от того, чтобы читать данные по живому из файловой системы. А потому для ответа на вопрос желательно понимать, чего ты с этой информацией собираешься дальше делать
2
zer0mail
2354 / 1984 / 198
Регистрация: 03.07.2012
Сообщений: 7,117
Записей в блоге: 1
18.09.2013, 12:16 #11
Цитата Сообщение от HoseMose Посмотреть сообщение
итоге имею массив свыше 100 тыс. строк . На что программа естественно ругается.
А как программа ругается? В VS2010 спокойно создается int массив из 10млн элементов + вектор на 100 млн...
1
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,056
18.09.2013, 12:19 #12
Цитата Сообщение от zer0mail Посмотреть сообщение
А как программа ругается?В VS2010 спокойно создается int массив из 10млн элементов
Цитата Сообщение от HoseMose Посмотреть сообщение
В итоге имею массив свыше 100 тыс. строк .
а ты случайно не локальный массив создаешь?
если да то просто стека не хватает
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
18.09.2013, 12:29 #13
Цитата Сообщение от CheshireCat Посмотреть сообщение
HoseMose чего-то недоговаривает.
по ходу хочет таким образом вытащить файловое дерево с удаленного хоста)
1
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,533
Завершенные тесты: 1
18.09.2013, 12:32 #14
Цитата Сообщение от Evg Посмотреть сообщение
А с какой целью создаётся массив?
Это вопрос дня.
1
Tulosba
18.09.2013, 12:52     Нужен совет !На что заменить гиганский массив
  #15

Не по теме:

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

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2013, 12:52
Привет! Вот еще темы с ответами:

Нужен совет! - C++
Народ вот у меня вопрос если я прочитаю книгу &quot;Программирование. Принцыпы и практика использования C++&quot; и кое что не пойму то стоит ли...

Нужен совет! - C++
Доброго времени суток! Возможно таких тем как эта было уже миллион.. но всё же, хотелось бы услышать ваше мнение. Поставил перед...

Нужен совет - C++
Всем добрый день. Кто нибудь может поделиться компилятором Турбо Си++ или каким нибудь другим ...? Или подсказать где можно...

Нужен совет! - C++
Здравствуйте уважаемые! Подскажите пожалуйста книгу по С++ , чтобы в ней толком обьяснялось про такие детали, как к примеру _WIN32_WINDOWS...


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

Или воспользуйтесь поиском по форуму:
15
18.09.2013, 12:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru