【发布时间】:2014-04-07 02:35:12
【问题描述】:
我有多个数据集如下,我想用 PHP 处理它们。
Dataset #1 (75 cols * 27,000 rows)
col #1 col #2 ...
record #1
record #2
...
Dataset #2 (32 cols * 7,500 rows)
....
Dataset #3 (44 cols * 17,500 rows)
....
这里的记录数和列数不同,所以很难使用数据库结构。 请注意,数据集的每个“单元格”仅由实数或 N/A 组成......并且数据集完全固定,即不会有任何变化。
所以到目前为止我所做的是将它们作为基于文件的表,并在文件中写入每条记录的起始偏移量。 使用这种方式,实现了相当不错的访问加速,但目前还不能令人满意,因为对每条记录的访问都需要将其解析为 PHP 数据结构。
我最终想要实现的是消除解析步骤。但是序列化并不是一个好的选择,因为它会加载整个数据集。当然可以像我一样序列化每条记录并保持它们的偏移量,但没有序列化,但我似乎不是那么花哨。
那么问题来了,有没有什么方法可以在没有任何解析步骤的情况下加载数据集的一部分,但比我建议的部分序列化更好?
非常感谢。
- 更多信息
也许我让观众有点困惑。 每个数据集都是分离的,它们作为独立的文件存在。
通常的数据访问模式是逐行的。每行都有唯一的字符串 ID,一个数据集中的 ID 可以存在于其他数据集中,但不一定。但最重要的是,当我有一些查询来获取数据集中的特定行时,我关心的是加快访问速度。例如,假设有一个如下所示的数据集。
Dataset #1 (plain-text file)
obs1 obs2 obs3 ...
my1 3.72 5.28 10.22 ...
xu1 3.44 5.82 15.33 ...
...
qq7 8.24 10.22 47.54 ...
还有对应的索引文件,用PHP序列化。每个item的key代表数据集中的唯一ID,value代表它们在文件中的偏移量
Index #1 (PHP-serialized one, not same as actual serialized one)
Array (
"my1" => 0,
"xu1" => 337,
...
"qq7" => 271104
)
因此可以知道记录“xu1”从数据集文件开头的 337 个字节开始。 为了使用它们的唯一 ID 访问和获取某些行,
1) Load serialized index file
2) Find matching IDs with query
3) Access to those position and fetch rows, and parsing them as an array of PHP.
我遇到的问题是
1) Since I using exact matching, it is impossible to fetch multiple rows that partially matching with query (for example, fetch "xu1" row from query "xu")
2) Even though I indexed dataset, fetch speed is not satisfactory (took 0.05 sec. from single query)
3) When I tried to solve above problem by serializing an entire dataset, (maybe of course) the loading speed become substantially slower.
解决上述问题的唯一最简单的方法是将它们作为数据库我会这样做, 但希望找到更好的方法,将它们保留为纯文本或类似文本的格式(例如,序列化或 json 编码)。
非常感谢和关心我的问题!
【问题讨论】:
-
你有大量的数据集吗?如果不能,您可以为每个数据集创建一个表吗?
-
您能谈谈您的数据访问模式吗?数据集中的列代表什么?每个数据集中是否有任何列是列的键类型或通常用于查找的列?数据的总大小是多少?这些数据表是否完全相关(即您是否需要进行关系查找)?
-
@steven 我有大约 100 个数据集,它们的行和列 # 都不同。由于它在不断增加,因此很难将它们全部维护为数据库表。如果这是实现目标的唯一方法,我会这样做,但我会尽可能避免这样做。
-
@MikeBrant 每个数据集彼此部分链接。每条记录(我的数据集中的行)通过字符串具有唯一的 ID,如果多个数据集具有共享的唯一 ID,则可以链接它们。通常的数据集大小从(8 列 * 500 行)到(300 列 * 30,000 行)不等,所以很难说它有多大,但每个数据集大约 7 MiB,以纯文本格式。可能需要关系查找,但不一定如此。数据访问模式几乎主要是每行。数据集是按行索引的,访问也是按行的(但通常不是顺序的)。这就是我使用纯文本的原因。
标签: php database serialization