假设我有一个包含 30.000 行的字典文件(自然字符串排序),存储在某个 json
文件中。我希望用户输入一些字符,然后相对于字典动态自动完成他的输入。做到这一点的最佳策略是什么:
- 将这个
json
文件分成小的json
文件 block ,然后根据第一个字符指定调用的url
,使ajax调用命中一个大约 1000 行的文件(无论如何,这个解决方案看起来很糟糕并且不可维护) - 将此文件放入某个
sql
表中,对其进行索引并通过ajax
调用它
显然,对于大文件,第二种方法更好,但对于小文件,当然搜索算法通过索引会快得多,但在每次击键时调用整个 daba 机制可能不是最好的方法。
最佳答案
这里有几个问题。数据的存储方式和服务方式之间不需要有任何关联。通常两者之间的数据没有相关性。
我同意 Pointy 的观点,您应该做的第一件事就是提供一个非常简单的解决方案,即提供整个文件并仅在客户端对其进行操作。评估所提供的文件的大小和性能。这足以满足您的需求吗?如果是这样,请不要进行不必要的优化。
注意:测试性能时,请确保您拥有具有实际方差和数据范围的生产规模数据集。
如果这还不够好,您需要确定瓶颈是什么。是客户端的查找吗?是数据传输吗?数据是在加载时传输还是在第一次需要时传输?如果第一次需要的话提前转移是否合理?这能解决问题吗?
如果问题确实是将大量数据从服务器传输到客户端,则编写一个智能服务器端处理程序,将数据以 block 的形式存储在内存中,通常按第一个字母或前两个字母,并根据需要提供这些 block 。确保每个 block 都可以单独缓存(适当的缓存 header )。
如果问题不在于传输,而在于客户端处理(这很可能),请查看如何将数据存储在 JSON 文件中。创建索引可能会有好处,当您第一次加载数据时,循环遍历它并创建以每个第一个字母开头的所有项目的新列表,然后创建以两个字母组合开头的所有项目,然后当您访问您需要的内容时,您可以使用这些列表,如下所示:
var oneLetterIndex = {};
oneLetterIndex['a'] = [items starting with a...]
oneLetterIndex['b'] = [items starting with b...]
...
// do the above dynamically of course..
然后评估,如果需要更多性能,请对两个字母执行相同的操作..
var twoLetterIndex = {};
twoLetterIndex['aa'] = [...];
twoLetterIndex['ab'] = [...];
...
twoLetterIndex['zz'] = [...];
// again, do dynamically and skip the two letter combos that don't exist in data
关于javascript - 解析小文件性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25287568/