Я работаю над приложением, в котором мне нужно сравнить 10^8 записей (буквенно-цифровые записи). Чтобы получить записи из файла (размер файла составляет 1,5 ГБ), а затем для их сравнения, мне нужно потратить менее 5 минут. Итак, что было бы эффективным способом сделать это, поскольку только время получения превышает 5 минут. И мне нужно работать только с файлом. пожалуйста, предложите выход. Я работаю над окнами с 3 ГБ оперативной памяти n 100 Гб жесткого диска.Как получить большой файл
ответ
- Прочтите часть файла, отсортируйте ее, напишите во временный файл.
- Объединить полученные файлы.
+1 для простой, простой, не может спорить с этим ответом! –
Если время поиска превышает 5 минут, кажется, что вам нужно посмотреть, как вы читаете этот файл. Одна вещь, которая вызвала плохую производительность для меня, заключается в том, что реализация C иногда использует поточные операции ввода-вывода по умолчанию, и вы можете получить некоторую скорость с помощью небезопасного ввода-вывода.
На каком компьютере это будет работать? Многие компьютеры в настоящее время имеют несколько гигабайт памяти, поэтому, возможно, это будет просто читать все это в памяти, а затем сортировать там (например, с помощью qsort)?
мой компьютер имеет 3gb RAM n 100gb жесткий диск. нужно запускать на окнах. – suvirai
Обработка ошибок и заголовок не включены. Вам необходимо предоставить DataType
и cmpfunc
, образцы предоставлены. Вы должны быть в состоянии вывести основные разработки этого фрагмента:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
typedef char DataType; // is this alphanumeric?
int cmpfunc(char const *left, char const *right)
{
return *right - *left;
}
int main(int argc, char **argv)
{
int fd = open(argv[1], O_RDWR|O_LARGEFILE);
if (fd == -1)
return 1;
struct stat st;
if (fstat(fd, &st) != 0)
return 1;
DataType *data = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (!data)
return 1;
qsort(data, st.st_size/sizeof(*data), cmpfunc);
if (0 != msync(data, st.st_size, MS_SYNC))
return 1;
if (-1 == munmap(data, st.st_size))
return 1;
if (0 != close(fd))
return 1;
return 0;
}
Я не могу себе представить, вы можете получить гораздо быстрее, чем это. Убедитесь, что у вас достаточно адресного пространства виртуальной памяти (1,5 ГБ подталкивает его, но, вероятно, просто работает на 32-битной Linux, вы сможете управлять этим на любой 64-битной ОС). Обратите внимание, что этот код «ограничен» для работы в POSIX-совместимой системе.
С точки зрения C и эффективности этот подход ставит всю операцию в руки ОС и отличный алгоритм qsort
.
Обратите внимание, что это ** не ** стандартно в соответствии с C - он будет работать только в операционных системах POSIX. Также обратите внимание, что он будет работать только в том случае, если ваш тип данных имеет фиксированный размер. –
Кроме того, 'qsort' неэффективен, когда данные, подлежащие сортировке, расположены на вторичном хранилище - это не * внешний * алгоритм сортировки. –
@Billy ONeal: Конечно. Но в свете OP, а также превосходства и повсеместности POSIX-систем код является одновременно и просвещенным, и эффективным. –
- 1. Как получить большой файл на сервере heroku
- 2. Как отредактировать большой файл
- 3. Как загрузить большой файл
- 4. Как оптимизировать большой HTML-файл
- 5. Попытка получить большой файл xml через api.php
- 6. Как сохранить большой файл json в файл?
- 7. Как обрабатывать большой файл MXML
- 8. Как sqlite3 редактирует большой файл?
- 9. Как загрузить большой файл CSV?
- 10. Как загрузить большой файл асинхронно
- 11. Как обновить большой файл XML
- 12. Как загрузить большой файл yii2
- 13. Как читать большой файл csv?
- 14. Отправить файл RecyleBin, большой файл получить постоянное удаление
- 15. Как получить большой файл через сетевой поток C#?
- 16. Как отправить и получить большой файл через HTTP в C#
- 17. Декомпрессированный файл слишком большой
- 18. WAR Файл слишком большой
- 19. разбор большой файл
- 20. андроид скачать большой файл
- 21. Искра, читающая большой файл
- 22. Файл LoadXML слишком большой
- 23. Android читает большой файл
- 24. RxNetty загрузить большой файл
- 25. Прочитать большой файл параллельно?
- 26. Показать большой файл BMP
- 27. phpmailer - приложить большой файл
- 28. читать большой файл json
- 29. большой JSON файл Swift
- 30. Как загрузить большой файл с помощью httplib2
Было бы полезно узнать что-то о домене «записей» - это строки, целые числа или что? –
Вы уверены, что вам нужно отсортировать все записи за один проход? Как вы будете использовать результат? –
О, извините, они буквенно-цифровые – suvirai