如何将大量数据从文件导入到应用程序内的sqlite(实时)

时间:2010-12-12 13:21:56

标签: iphone objective-c database import sqlite

我在CSV文件中有一个很大的单词列表(超过2百万)(大小约35MB)。 我想用索引(原始密钥)将CSV文件导入sqlite3。 所以我使用sqlite命令行工具导入它。数据库已经创建,.sqlite文件的大小已经增长到超过120MB! (因为主键索引占50%)

这里我们遇到了问题:如果我将这120MB .sqlite文件添加到资源中,即使压缩到.ipa文件后它也有> 60MB。而且我想它是否会低于30MB(因为通过E / 3G的限制)。

另外由于我无法通过Web服务导入它(zipped sqlite文件)(45MB * 1000下载= 45GB!这是我服务器的半年限制)。

所以我认为我可以这样做:

  1. 将CSV文件压缩为ZIP,文件只有7MB文件。
  2. 将ZIP文件添加到资源。
  3. 在应用程序中我可以解压缩文件并将数据从解压缩的CSV文件导入到sqlite。
  4. 但我不知道该怎么做。我试过这样做:

    sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg);
    

    但它不起作用。失败的原因是“.import”是命令行界面的一部分,而不是C API中的一部分。

    所以我需要知道如何将它(解压缩的CSV文件)导入app内的SQLite文件(而不是在使用命令行进行开发时)。

3 个答案:

答案 0 :(得分:2)

如果您插入的单词是唯一的,则可以将文本作为主键。

如果您只想测试一组中是否存在单词(例如拼写检查程序),则可以使用替代数据结构,例如布隆过滤器,每个单词只需要9.6位,误报率为1%。

http://en.wikipedia.org/wiki/Bloom_filter

答案 1 :(得分:1)

正如FlightOfStairs根据要求提到的,布隆过滤器是一种解决方案,如果您需要完整数据,另一种解决方案是使用trieradix tree数据结构。您可以预处理数据并构建这些数据结构,然后将其放入sqlite或其他一些外部数据格式。

答案 2 :(得分:0)

最简单的解决方案是使用NSScanner编写CSV解析器,然后逐行将这些行插入数据库。这实际上是一项相当容易的工作 - 您可以找到完整的CSV解析器here