2015-06-22 2 views
8

Я использую Atom/Electron для создания приложения, которое имеет визуализацию по видео на основе данных. Каждое видео имеет соответствующий файл CSV с информацией для каждого кадра. Видеоролики составляют около 100 минут, поэтому в файлах есть много данных!Лучший способ чтения из большого CSV-файла без загрузки всего в память с помощью Javascript

Проблема, с которой я сталкиваюсь, заключается в том, что загрузка и анализ файла занимает пару секунд. В большинстве случаев это не проблема. Но мне нужно сделать плейлист из частей видео, и загрузка всего CSV-файла при каждом изменении видео не является жизнеспособным вариантом.

Я искал файловые потоковые параметры как fast-csv, но мне не удалось начать чтение для произвольной части файла.

EDIT: из документации FS. В этом случае вопрос заключается в том, как я могу узнать, какой байт соответствует позиции, которую я хочу в файле?

опции могут включать начальное и конечное значения для чтения диапазона байтов из файла вместо всего файла. И начало и конец включительно и начать с 0.

Как вы думаете, было бы лучше и наиболее производительным подход к этой ситуации?

В бетоне:

Есть ли способ запуска читать поток из любой части файла CSV?

Считаете ли вы, что существует другой способ хранения, который позволил бы мне решить эту проблему лучше?

+1

Являются ли ширины столбцов фиксированными в csv? (например, столбец 1 всегда содержит 20 символов) –

+0

Этот вопрос может быть полезен: http://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js Я не знаю достаточно о узле, чтобы ответить наверняка, но мне кажется, что вы хотите отправить на линию csv за раз. –

+0

@DevinH. нет, но каждый столбец всегда является числом, поэтому нетрудно использовать какое-то дополнение. В идеале я бы предпочел не делать этого. Я думал об индексировании позиции байта каждой строки. И храните массивы с позициями. Это не проблема при обработке некоторых файлов, когда файл будет загружен в первый раз. – limoragni

ответ

1

За мой комментарий, Sqlite кажется, что ищете. Возможно, это не ваше постоянное решение в долгосрочной перспективе, но оно, безусловно, будет работать пока вы решите, хотите ли вы придерживаться его или закодировать свое собственное решение.

Внутренняя работа Sqlite

Sqlite оптимизирован для ядра, но она имеет три основные функции, которые заставляют его выполнять быстрее обычного диска читает, особенно CSV файлы:

  1. Вся база данных (каждая создаваемая вами база данных) хранится в одном файле, а не в нескольких файлах или записях.
  2. Этот файл выгружается в блоки размером 1024 байта (1 КБ), что позволяет легко перемещаться по данным.
  3. (Действительно, часть 2). Вся база данных и система подкачки - это одно массивное двоичное дерево, которое обычно занимает менее 10 прыжков, чтобы найти любые данные.Так что в условиях непрофессионала, очень быстро!

Если вы действительно заинтересованы в понимании полного объема всего этого, я не нашел лучшего объяснения, кроме this amazing blog post by Julia Evans.

Возможных Недостатки

Помимо внутренних работ, Sqlite предназначен для клиентской стороны работает на компьютере пользователя. Если это не жизнеспособное решение, можно обходиться с обходными решениями. Например, Sqlite может использоваться как веб-сервер, но он действительно процветает в одиночной или смешанной установке. Также помните, что каждый клиентский компьютер отличается. Один компьютер может обрабатывать записи быстрее, чем следующий, но в целом вам не нужно беспокоиться, поскольку компьютеры на стороне клиента обычно находятся под небольшой нагрузкой.

  • Автономное будет требовать, чтобы все было на стороне клиентов. Обычно это используется как Sqlite. Я использовал его для игр в прошлом, используя sqlite4java's API для подключения к базе данных с Java; API заставлял весь опыт чувствовать себя как PHP и MySQL на сервере. Возможно, вам придется найти другие API, так как Sqlite написан на C.
  • Смешанная инстилляция выполняется так же, как и автономная, но вы кодируете в свою программу ссылку на фактический сервер. Для игр я помог сделать так, чтобы мы отслеживали такие вещи, как оценки и пользовательские данные, а затем периодически в фоновом режиме передавали это реальному серверу, если бы мы могли получить соединение. Это также работает в обратном порядке. Вы можете запустить пользователя с нуля, но при первом запуске он может загрузить все, что вам нужно, и с этого момента сохранить свою актуальность с тем, что находится на сервере.

Резюме

Sqlite будет работать на то, что вам нужно, но может потребовать небольшую домашнюю работу для установки в моде вам нужно. Например, Sqlite4java прост в установке, но сбивает с толку, поскольку их документация настолько бедна; Однако переполнение стека заставило меня пройти через это. Sqlite также использует его и забывает о типе установки, поэтому, чтобы ответить на ваш вопрос, он будет обрабатывать 25 строк в секунду, как торт, вам не нужно беспокоиться об оптимизации его только собственного кода.

2

Я бы очень рекомендовал Papaparse для этого. Он позволяет потоковой передачи CSV «по очереди», который может обрабатываться в формате JSON на основе заголовков в файле.

Внутри объекта конфигурации, переданного функции разбора, вы можете указать параметр «шаг», который является функцией, выполняемой для каждой строки файла по мере ее выполнения.

Примечание: Может быть настроен на использование рабочего-нить для повышения производительности при работе с очень большой CSV-

http://papaparse.com/docs

+0

Хорошо, это круто, но я думаю, что это не что иное, как что-то вроде fast-csv или csv-parser. Это не дает мне возможность начать поток из произвольной строки csv. Если мне нужно начинать потоковое вещание всегда с самого начала, решение не подходит моему делу. Знаете ли вы, есть ли способ прыгнуть в заданную строку? – limoragni

+0

Если, например, вам потребовалась информация, которая находилась в строке 500 файла, ваша функция «step» просто поймала бы это и не будет обрабатывать другие строки. Технически, чтобы начать потоковое воспроизведение из определенной точки в файле, начало файла все равно необходимо было загрузить в некоторой степени, чтобы знать, что вы достигли требуемой точки. Если обработка не выполняется на определенном «шаге», она быстро перемещается по файлу - поэтому я не буду беспокоиться о проблемах с производительностью. – locksem

+0

У меня были ошибки с использованием fast-csv для синтаксического анализа больших csv в nodejs, но ошибок в этой библиотеке не было (с тем же csv-файлом) https://github.com/wdavidw/node-csv – steampowered

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