2013-05-28 5 views
0

Мне нужно прочитать файл csv в основной памяти, и я хотел бы узнать самый быстрый язык программирования для этого. Файл содержит временные ряды:Что такое быстрый способ чтения файла csv

время, значение
1366810163,177.413
1366810164,177.303
1366810165,177.413
1366810166,178.9797

Я хочу, чтобы оценить/O улучшения производительности ввода при сжатии данных, как это уже сделано здесь: http://entland.homelinux.com/blog/2006/10/25/reading-files-as-fas-as-possible/ Этот блог с 2006 года и предназначен только для языка программирования на C++. Но я также хочу оценить затраты на ввод-вывод для декомпрессии.

Итак, вы можете помочь мне с опытом работы на любом языке программирования/операционной системе. Затем я подведу ваши ответы и сделаю путеводитель. Благодарим за помощь!

+0

Поскольку IO является узким местом такого приложения, я думаю, что место для оптимизации производительности будет сильно зависеть от используемого вами оборудования. Сколько у вас жестких дисков? Можете ли вы разбить файл на несколько разделов? Какой у вас жесткий контроллер контроллера? Вы используете RAID? Что такое операционная система и тип файловой системы? –

+0

Для первых экспериментов оценивается только один накопитель SSD. Я просто прошу вашего опыта в любой ОС с любым языком программирования и файловой системой. (Я надеюсь, что это не слишком неспецифично, но я бы использовал все, что было бы лучше). – schowave

ответ

1

Предполагая, что я могу выбрать аппаратное обеспечение для оптимизации этой задачи, необработанные данные сохраняются как есть, не требуется синтаксический анализ, и у нас есть доступ на низкоуровневый доступ к аппаратным средствам, а затем с учетом этих допущений XIP будет самым быстрым - нагрузка равна нулю!

0

C или C++ с zlib будет самым быстрым, если он написан правильно. (Ассемблер может быть быстрее, хотя для больших программ ему становится все труднее бить хороших компиляторов.)

zlib's gz* functions прочитает файл, сжатый с помощью gzip или не прозрачно. Обычно быстрее считывать меньше данных с запоминающего устройства большой емкости и декомпрессировать, чем читать более несжатые данные с запоминающего устройства большой емкости. Даже с SSD.

На моем 2 ГГц i7 я могу прочитать и проанализировать 56.2 MiB CSV-файл с 201429 записями из 24 полей каждый примерно за 0,3 секунды времени процессора, если несжатый, 0,4 секунды, если сжат. В режиме реального времени после того, как буферы памяти были очищены, чтение с SSD, это 0,5 секунды, если сжато, 0,6 секунды, если не сжато. (Обратите внимание на разворот между временем процессора и реальным временем.)

+0

можете ли вы предоставить код инструмента, который вы использовали в этом эксперименте? Хотелось бы поспорить, что на Java можно написать столь же быстрый инструмент, но его нужно тестировать в большем файле, чем 56 МБ. больше похоже на 500 МБ, так как Java JVM должен прогреваться. –

+0

Я не могу предоставить код. Это, вероятно, не так полезно, как вы думаете, если вы пишете на Java. Мой C-код тратит несколько усилий на минимизацию скорости malloc(). Я сомневаюсь, что вы получите версию Java, работающую так же быстро, так как будет намного больше управления памятью. Мой совет - использовать RFC 4180, чтобы убедиться, что вы можете читать стандартные файлы CSV. –

+0

@MarkAdler: спасибо за ваш ответ, это было полезно. Я уже догадался, что c/C++ будет иметь некоторые преимущества по сравнению с Java. Итак, для несжатого способа, какую функцию вы используете, fread()? Используете ли вы функции zlib для чтения сжатых данных? Есть ли фрагменты кода, которые вы могли бы предоставить? Еще раз спасибо за вашу помощь! С fread() я могу прочитать файл 30 МБ с 1 561 660 записями за 0.3 секунды. – schowave

Смежные вопросы