0

基线 - 我有 10,000 个条目的 CSV 数据。我将其保存为 1 个 csv 文件并一次全部加载。

替代方案 - 我有 10,000 个条目的 CSV 数据。我将其保存为 10,000 个 CSV 文件并单独加载。

这在计算上大约效率低多少。我对内存问题不是很感兴趣。替代方法的目的是因为我经常需要访问数据的子集并且不想读取整个数组。

我正在使用python。

编辑:如果需要,我可以使用其他文件格式。

编辑1:SQLite 获胜。与我之前所做的相比,这非常简单和高效。

4

3 回答 3

6

SQLite是您应用程序的理想解决方案。

只需将 CSV 文件导入 SQLite 数据库表(它将是单个文件),然后根据需要添加索引。

要访问您的数据,请使用 python sqlite3 库。您可以使用本教程了解如何使用它。

与许多其他解决方案相比,SQLite 将是在本地选择部分数据集的最快方法——当然比访问 10000 个文件要快得多。另请阅读此答案,该答案解释了 SQLite 为何如此出色。

于 2013-10-23T03:33:30.273 回答
1

我会将所有行写入一个文件。对于 10,000 行,这可能不值得,但您可以将所有行填充到相同的长度 - 例如 1000 字节。

然后很容易到seek第n行,只需将n乘以行长

于 2013-10-23T03:23:27.320 回答
0

10,000 个文件的加载和访问速度将比一个文件慢,这仅仅是因为文件的数据可能会分散在您的磁盘驱动器周围,因此访问它需要比访问单个文件的内容更多的寻道次数文件,通常会尽可能按顺序存储。寻道时间对旋转媒体来说是一个很大的减慢,因为您的程序必须等待驱动头物理重新定位,这可能需要几毫秒。(对于 SSD 来说,缓慢的查找时间不是问题,但即便如此,操作系统仍然需要处理 10,000 个文件的元数据开销)。同样对于单个文件,操作系统可以通过预读缓冲为您加快速度(因为它可以合理地假设如果您读取文件的一部分,您可能很快就会想阅读下一部分)。对于多个文件,操作系统无法做到这一点。

我的建议(如果您不想走 SQLite 路线)是使用单个 CSV 文件,并且(如果可能)用空格填充 CSV 文件的所有行,以便它们都具有相同的长度。例如,假设您确保在写出 CSV 文件时使文件中的所有行的长度正好为 80 字节。然后读取文件的第 (n) 行变得相对快速和容易:

myFileObject.seek(n*80)
theLine = myFileObject.read(80)
于 2013-10-23T03:46:44.603 回答