Загрузка данных CSV в Redis

У меня есть файл CSV с 1000 строк и около 15 столбцов. Я планировал хранить каждую строку как простой объект JSON в качестве значения Redis и номер строки CSV-файла в качестве ключа Redis. Однако как только я начну загружать несколько CSV-файлов в Redis, как лучше всего отличить один CSV-файл от другого в БД? Разве Redis не представляет собой просто все ключи-значения без каких-либо других более крупных структур, кроме ключей, отличных от самих экземпляров Redis DB? Я знаю, что Redis находится в памяти, но даже в этом случае... не будет ли немного неэффективно искать нужный ключ, если у вас есть миллионы записей? Я не понимаю. Если бы я загрузил 1 миллион CSV-файлов, в каждом из которых было бы 1000 строк, это был бы 1 миллиард записей для поиска, что слишком много даже для БД в памяти. Я должен сделать это по-другому.

Я ищу способ представить каждый из моих файлов CSV в Redis эффективным и разумным образом, где каждая строка файла CSV имеет свой собственный уникальный ключ, а значением Redis будут заголовки столбцов и данные.

Как мне это сделать?

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


person Alexander Mills    schedule 28.04.2015    source источник
comment
какой лучший ключ для ваших данных в Redis действительно зависит от того, как вы будете использовать свои данные и характеристики ваших данных. Вы можете начать с использования уникального идентификатора в вашем csv в качестве ключа. Эта статья openmymind.net/Data-Modeling-In-Redis поможет вам иметь общее представление.   -  person number5    schedule 28.04.2015


Ответы (2)


Вы подходите к делу творчески.

Вы не указываете, важно ли хранить все CSV отдельно, или все данные могут быть объединены в одну логическую структуру типа «группа» (как в таблице в СУБД).

Исходя из предположения, что все данные могут идти вместе, вы можете оставить один ключ для увеличения глобального счетчика ваших идентификаторов для каждой «строки»:

// synchronous for easy writing/reading
var rowid = client.get('csv row counter');
rowid = rowid || 1;

// `csv` is an array of your json objects
for (var i=0; i<csv.length; i++) {
    client.set('csv-'+(rowid+i), JSON.stringify(csv[i]));
}

client.set('csv row counter', rowid+i);

Если вам нужно использовать этот метод, просто убедитесь, что rowid имеет правильную область действия, чтобы одновременные загрузки увеличивались соответствующим образом.

Если вместо этого вам нужно отслеживать каждый CSV отдельно, вам просто нужно назвать строку с некоторой ссылкой на ее CSV:

// `csvname` is initialized with the chosen name for this csv
for (var i=0; i<csv.length; i++) {
    client.set(csvname+'-'+i, JSON.stringify(csv[i]));
}
person Jason    schedule 28.04.2015
comment
да, вы можете поместить все данные для всего файла CSV в одну пару ключ-значение, я просто подумал, что это может быть не очень эффективно, особенно для поиска - person Alexander Mills; 28.04.2015
comment
Я не предлагал вам поместить весь CSV в одну пару «ключ-значение», а предпочел, чтобы ключи для строк разных CSV не обязательно были логически разделены (в первом примере). Если вам нужно, чтобы они были логически разделены, вы можете использовать второй пример. - person Jason; 28.04.2015

Хранилища ключей и значений позволяют заменить линейный поиск строки в CSV-файле более быстрым поиском (обычно O(log n)) в структуре данных. И может также дать вам диапазон запросов по ключевым значениям.

Использование только имени файла в качестве ключа не принесет вам много пользы по сравнению с оставлением данных в файловой системе. Но {file name}.{row number} и сохранение каждой строки как значения может быть тем, что вам нужно, в зависимости от того, что находится в каждой строке.

В двух словах: храните небольшие значения; выберите в качестве ключа что-то, что вы часто ищете и что имеет смысл при сортировке.

person Will Angley    schedule 28.04.2015