Что самый быстрый путь состоит в том, чтобы считать файл на 10 ГБ из диска?

Можно сделать это этот путь:

var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };

var array = new[] { o, o1 };
var list = array.ToList();

list.Add(new { Id = 3, Name = "Yeah" });

Это кажется небольшим "hacky" мне, но это работает - если Вы действительно должны иметь список и не можете только использовать анонимный массив.

11
задан Peter Mortensen 12 October 2009 в 16:47
поделиться

12 ответов

Большую часть времени вы будете привязаны к вводу-выводу, а не к процессору, поэтому просто прочтите этот файл через обычный ввод-вывод Perl и обработайте его в одном потоке. Если вы не докажете, что можете выполнять больше операций ввода-вывода, чем работает ваш единственный процессор, не тратьте время ни на что большее. В любом случае, вы должны спросить: почему это на Земле находится в одном огромном файле? Почему, черт возьми, они не разделяют его разумным образом, когда создают его? Было бы на порядок больше работы. Затем вы можете поместить его в отдельные каналы ввода / вывода и использовать больше процессоров (если вы не используете какой-то RAID 0 или NAS или ...).

Измерьте, не предполагайте . Не забывайте очищать кеши перед каждым тестом. Помните, что сериализованный ввод-вывод намного быстрее, чем случайный.

9
ответ дан 3 December 2019 в 03:36
поделиться

Кажется, я припоминаю проект, в котором мы читали большие файлы. Наша реализация использовала многопоточность - в основном n * worker_threads начинались с увеличения смещения файла (0, chunk_size, 2xchunk_size, 3x chunk_size ... n-1x chunk_size) и читал меньшие фрагменты информации. Я не могу точно вспомнить наши аргументы в пользу этого, поскольку кто-то другой проектировал все это - не только рабочие, но примерно так мы это сделали.

Надеюсь, это поможет

0
ответ дан 3 December 2019 в 03:36
поделиться

У меня есть коллега, который ускорил чтение FIX, перейдя на 64-битный Linux. Если это что-то стоящее, потратите немного денег, чтобы приобрести более качественное оборудование.

1
ответ дан 3 December 2019 в 03:36
поделиться

Basically need to "Divide and conquer", if you have a network of computers, then copy the 10G file to as many client PCs as possible, get each client PC to read an offset of the file. For added bonus, get EACH pc to implement multi threading in addition to distributed reading.

1
ответ дан 3 December 2019 в 03:36
поделиться

Думали ли вы о потоковой передаче файла и фильтрации во вторичный файл каких-либо интересных результатов? (Повторяйте, пока не получите файл приемлемого размера).

2
ответ дан 3 December 2019 в 03:36
поделиться

Хотел бы я знать больше о содержимом вашего файла, но не зная, кроме того, что это текст, это звучит как отличная проблема типа MapReduce.

PS, самое быстрое чтение любого файла - это линейное чтение. cat file> / dev / null должна быть скоростью, с которой файл может быть прочитан.

3
ответ дан 3 December 2019 в 03:36
поделиться

Возможно, вы уже читали эту ветку форума, но если нет:

http://www.perlmonks.org/?node_id=512221

Здесь описывается использование Perl для выполнения это построчно, и пользователи, кажется, думают, что Perl вполне на это способен.

О, можно ли обработать файл с RAID-массива? Если у вас несколько зеркальных дисков, то скорость чтения можно улучшить. Конкуренция за дисковые ресурсы может быть причиной того, что ваша попытка многопоточности не сработает.

Желаем удачи.

3
ответ дан 3 December 2019 в 03:36
поделиться

Все зависит от того, какую предварительную обработку вы можете выполнять и когда. В некоторых из имеющихся у нас систем мы сжимаем такие большие текстовые файлы с помощью gzip, уменьшая их до 1/5 - 1/7 от их исходного размера. Отчасти это стало возможным благодаря тому, что нам не нужно обрабатывать эти файлы. до тех пор, пока они не будут созданы через несколько часов, и во время создания у нас действительно нет никакой другой нагрузки на машины.

Их обработка выполняется более или менее в стиле zcat thosefiles | ourprocessing. (ну, это делается через сокеты unix, хотя и с помощью специального zcat). Он меняет время процессора на время дискового ввода-вывода, и для нашей системы это хорошо того стоило. Конечно, существует множество переменных, которые могут сделать этот дизайн очень плохим для конкретной системы.

4
ответ дан 3 December 2019 в 03:36
поделиться

Один раз проанализировать файл, читая построчно. Поместите результаты в таблицу в приличной базе данных. Выполняйте столько запросов, сколько хотите. Регулярно кормите зверя новыми входящими данными.

Поймите, что манипулирование файлом размером 10 Гб, передача его по (даже локальной) сети, изучение сложных решений и т. Д. - все это требует времени.

1
ответ дан 3 December 2019 в 03:36
поделиться

If you are I/O bound and your file is on a single disk, then there isn't much to do. A straightforward single-threaded linear scan across the whole file is the fastest way to get the data off of the disk. Using large buffer sizes might help a bit.

If you can convince the writer of the file to stripe it across multiple disks / machines, then you could think about multithreading the reader (one thread per read head, each thread reading the data from a single stripe).

1
ответ дан 3 December 2019 в 03:36
поделиться

хммм, а что не так с командой read () в C? Обычно имеет ограничение в 2 ГБ, так что просто вызовите его 5 раз подряд. Это должно быть довольно быстро.

1
ответ дан 3 December 2019 в 03:36
поделиться

В задаче не указано, что последовательность действительно имеет значение или не. Так, разделите файл на равные части, скажем, по 1 ГБ каждая, и поскольку вы используете несколько процессоров, тогда несколько потоков не будут проблемой, поэтому читайте каждый файл с помощью отдельного потока и используйте ОЗУ емкостью> 10 ГБ, тогда все ваше содержимое будет сохранено в ОЗУ читается несколькими потоками.

0
ответ дан 3 December 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: