使用160万行(150MB)文件搜索CSV?

时间:2011-08-24 14:40:42

标签: performance matlab file-io large-files import-from-csv

我的CSV包含160万行数据,大约150MB,包含产品数据。我有另一个包含2000行的CSV,其中包含大CSV中的产品列表。它们通过一个独特的id相互关联。我们的想法是在CSV中添加2000行的产品数据。

databank.csv包含标题IDProduct NameDescriptionPricesm_list.csv标题为ID

结果是在sm_list.csv中输出带有产品的csv,相应的数据为databank.csv ... 2000行。

我的原始解决方案读入了所有sm_list,并逐行读取数据库。它会在sm_list中搜索从数据库读入的行中的ID。这导致2000x1.6Million = 3200万比较!

请您提供一个基本的算法大纲,以最有效的方式完成此任务?

2 个答案:

答案 0 :(得分:2)

假设您知道如何在MATLAB中读/写CSV文件(SO上的几个问题如何显示),这里有一个例子:

%# this would be read from "databank.csv"
prodID = (1:10)';     %'
prodName = cellstr( num2str(prodID, 'Product %02d') );
prodDesc = cellstr( num2str(prodID, 'Description %02d') );
prodPrice = rand(10,1)*100;
databank = [num2cell(prodID) prodName prodDesc num2cell(prodPrice)];

%# same for "sm_list.csv"
sm_list = [2;5;7;10];

%# find matching rows
idx = ismember(prodID,sm_list);
result = databank(idx,:)

%# ... export 'result' to CSV file ...

以上示例的结果:

result = 
    [ 2]    'Product 02'    'Description 02'    [19.251]
    [ 5]    'Product 05'    'Description 05'    [14.651]
    [ 7]    'Product 07'    'Description 07'    [4.2652]
    [10]    'Product 10'    'Description 10'    [ 53.86]

答案 1 :(得分:1)

必须使用matlab吗?如果您只是将所有数据输入数据库,那将更容易。一个简单的select tableA.ID, tableB.productname... where tableA.id = tableB.id就可以做到。