Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
1

Прочитать большой текстовый файл > 1Гб

23.12.2015, 23:35. Показов 1897. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь прочитать большой текстовый файл. 1Гб и более! Строки без пробелов, разделены "\n"
Пример файла:
"line1\n
line2\n
line3\n"


Падает на ошибке сегментирования. Учусь кодить на питоне, а тут потребовалось маленькую функцию на си написать. Башка уже не варит, трубадомшатал

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define buf 40                        // макс длина одной строки.
#define maxsize 34000000            // в файле 34 млн строк. Вроде из-за этого не работает.
// #define maxsize 10000            // ЕСЛИ СТРОК 10000, то работает как надо :(
 
 
int main(void) {
    char line[maxsize][buf];       // создаю массив
    FILE *plist = NULL;             // определяю переменную для открытия файла
    int i = 0;
    int total = 0;
 
    plist = fopen("123", "r");      // открываю файл
    while(fgets(line[i], buf, plist)) {
        /* get rid of ending \n from fgets */
        line[i][strlen(line[i]) - 1] = '\0'; // В массив добавляю каждую строку кроме "\n"
        i++;
    }
 
    total = i;
    fclose(plist);
 
    for(i = 0; i < total; ++i)
        printf("%s\n", line[i]);                      // Отладка. Вывожу строки из массива.
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2015, 23:35
Ответы с готовыми решениями:

Файл: Скопировать текст в другой текстовый файл файл, но чётные строки должны быть с большой буквы...
Создать текстовый файл. Скопировать текст в другой текстовый файл файл, но чётные строки должны...

Как прочитать большой файл
Подскажите, как грамотнее написать считывание из бинарного файла гигабайтного размера целых чисел...

Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл
Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл. Переписать в...

Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл согласно своему варианту. Dev C++
8)В новом файле заменить все латинские буквы верхнего регистра на буквы нижнего регистра.

18
528 / 431 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
23.12.2015, 23:42 2
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Для такого объема на стеке памяти не хватит по умолчанию. Выделяй память динамически. Либо не читай весь файл в память, а работай с ним по строкам.
1
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
23.12.2015, 23:46 3
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

1. Создавай массив в куче (для такого объема стека не хватит).
2. Зачем загружать в память весь файл? Разве нельзя его обрабатывать построчно или порциями?
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
23.12.2015, 23:46  [ТС] 4
Мне он как раз в оперативной памяти нужен. Для скорости и чтобы жесткий не насиловать. Динамически это использую malloc? Если не трудно запили строчку.
0
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
23.12.2015, 23:47 5
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Один-в-один советы
1
528 / 431 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
23.12.2015, 23:53 6
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Цитата Сообщение от ReesL Посмотреть сообщение
Динамически это использую malloc?
Да, например.
Цитата Сообщение от ReesL Посмотреть сообщение
Если не трудно запили строчку.
Примеров на форуме - тьма. Сделай поиск по malloc.

Не по теме:

Цитата Сообщение от zer0mail Посмотреть сообщение
Один-в-один советы
:)



Добавлено через 2 минуты
Цитата Сообщение от ReesL Посмотреть сообщение
Для скорости и чтобы жесткий не насиловать.
А ты по этому файлу бегаешь туда-сюда? Пользовательскую систему насиловать загружая оперативку нормально? Мап файла (либо его части) в память еще можешь сделать.
1
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
23.12.2015, 23:53 7
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Загружать огромный текстовый файл полностью в память, чтобы "не насиловать диск" - стопудово неудачная идея.
Блин, опять синхронно!
1
Velesthau
23.12.2015, 23:55
  #8

Не по теме:

Цитата Сообщение от zer0mail Посмотреть сообщение
Блин, опять синхронно!
Синхронизация в действии :)

0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
23.12.2015, 23:58  [ТС] 9
Цитата Сообщение от zer0mail Посмотреть сообщение
стопудово неудачная идея.
Почему неудачная? Скорость то возрастает в разы. Чем прочитать найти закрыть вернуть. Там миллиарды запросов к массиву.
Цитата Сообщение от Velesthau Посмотреть сообщение
Примеров на форуме - тьма. Сделай поиск по malloc.
Спс, уже ищу.
0
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
24.12.2015, 00:05 10
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Цитата Сообщение от ReesL Посмотреть сообщение
Почему неудачная? Скорость то возрастает в разы. Чем прочитать найти закрыть вернуть
1. Если каждая программа будет хавать память "по потребности", то ее (памяти ) просто не хватит. Наверняка можно придумать способ, как обойтись 10% (от объема файла) или даже меньшим без заметного замедления.
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
24.12.2015, 00:10  [ТС] 11
Вот ты о чем Согласен конечно. Но в моем случае, я готов пожертвовать 1-2 гигами оперативки. Обойтись может и получится, на это время нужно. Маны курить и тп. Мне по-быстрому запилить))
0
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
24.12.2015, 00:12 12
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

2. Система может просто не дать столько памяти и тогда задача вообще не будет работать.
3. Память может свопиться и в результате задача будет работать медленней, чем при использовании небольшого объема памяти.
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
24.12.2015, 00:17  [ТС] 13
На питоне эта реализация съедает 2-3Гб. Но загружается много сторонних/тяжелых модулей. На си, я думаю/надеюсь, меньше должно быть. Тут 20Кб кода + файл гиговый.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.12.2015, 00:30 14
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Цитата Сообщение от ReesL Посмотреть сообщение
Мне он как раз в оперативной памяти нужен.
тогда посмотри в сторону файлов проецируемых в память
открываешь файл, проецируешь его в память, и дальше работаешь как с обыкновенным файлом, а система сама решит что ей быстрее
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
24.12.2015, 00:43  [ТС] 15
Тут уже почти готово. Пара строчек осталась и все будет работать. Пока парюсь с malloc. 100% все легко, опыта нет
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.12.2015, 14:01 16
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Цитата Сообщение от ReesL Посмотреть сообщение
Пара строчек осталась и все будет работать.
Действительно, пара строчек. Если нужно ссылаться на строку по номеру, заполните ещё массив указателей на строки.
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
 
#define FILENAME "123"
 
int main() {
    struct stat st;
    if (stat ( FILENAME, &st)) return -1;
    char *line = malloc (st.st_size);
    if (!line) return -1;
 
    FILE *f = fopen(FILENAME, "r");
    if (!f) return -1;
 
    for (char *p= line; fgets(p , 100, f); ) {
      p= line + ftell (f);
      *(p-1) = 0;
    }
    fclose (f);
 
    for(char *p= line; (p - line) < st.st_size; p+=strlen (p)+1)
        printf("%s\n", p);
 
    free (line);
    return 0;
}
Добавлено через 10 минут
PS. Насчет целесообразности сразу читать весь большой файл в память - это целиком зависит от условий поставленной задачи. В иных случаях именно так и нужно.
1
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
24.12.2015, 15:42 17
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Цитата Сообщение от gng Посмотреть сообщение
это целиком зависит от условий поставленной задачи.
Банальная истина, даже говорить не о чем. В программировании программа всегда зависит от условий поставленной задачи.
Цитата Сообщение от gng Посмотреть сообщение
В иных случаях именно так и нужно.
За 20+ лет ни разу не было , чтобы было именно так и только так. Зато ситуации, когда при росте файла программа переставала работать случались. Приходилось менять алгоритмы или даже формат файла.
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.12.2015, 18:25 18
Лучший ответ Сообщение было отмечено ReesL как решение

Решение

Цитата Сообщение от zer0mail Посмотреть сообщение
ни разу не было , чтобы было именно так и только так.
Насчет "только так" речи и не было. Всегда есть варианты. А о целесообразности ТС вроде бы пояснил. 1) Памяти достаточно. 2) К данным постоянно будут идти разбросанные по всему файлу запросы.
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 10
24.12.2015, 23:13  [ТС] 19
Парни всем спсс за помощь и потраченное время Решил проблемку банально. На стэкоувэфло нашел готовый вариант кода. Всех с наступающим))
можно закрывать
0
24.12.2015, 23:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2015, 23:13
Помогаю со студенческими работами здесь

Файл: Хочу прочитать текстовый файл в textbox, но он выводит какой то бред...
Хочу прочитать текстовый файл в textbox, но он выводит какой то бред... Помогите пожалуйста. Вот...

Создать текстовый файл из 5 строк, прочитать созданный файл
Создать текстовый файл из 5 строк, прочитать созданный файл, 1. Из строк все цифры переписать в...

Разделить большой текстовый файл на множество файлов
Здравствуйте! Помогите, пожалуйста, разобраться. Есть с десяток txt-файлов с примерно таким...

Как сохранить большой текстовый файл в txt?
Вообщем пишу я тест, в конце теста выдаются коротки результаты в балах, но в этот момент, например...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru