2015-04-28 4 views
1

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

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

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

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

+1

Какой лучший ключ для ваших данных в redis действительно зависит от того, как вы будете использовать свои данные и характеристики ваших данных. Вы можете начать с использования уникального идентификатора в ключе csv. Эта статья http://openmymind.net/Data-Modeling-In-Redis/ поможет вам получить общую идею. – number5

ответ

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])); 
} 
+0

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

+1

Я не отдаленно предлагаю вам поставить весь CSV в один ключ-значение, а скорее, что ключи для строк разных CSV не обязательно должны быть логически разделены (в первом примере). Если вам нужно, чтобы они были логически раздельными, вы можете использовать второй пример. – Jason

2

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

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

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