首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何迭代两个大小不匹配的循环,使它们保持同步?

如何迭代两个大小不匹配的循环,使它们保持同步?
EN

Software Engineering用户
提问于 2014-12-03 23:08:03
回答 1查看 121关注 0票数 0

我有一个数据库表,其中每行都是一部电影(其中包含“title”、“director”和“jpeg_data”等字段),还有一个相关的表,其中每行都是一部电影的截图(包含“movie_id”和“jpeg_data”字段)。每部电影都有2-8张截图。

我想按顺序输出数据

  • 电影1
    • 截图1
    • 截图2

  • 电影2
    • 截图1
    • 截图2
    • 截图3
    • 截图4

现在,我发现的最简单的解决方案是执行(一个粗略的伪代码):

代码语言:javascript
运行
复制
for movie in database.select id,title,director from movies
    print movie.title, movie.director
    for screenshots in database.select screenshots where movie_id = id
        print screenshots.screenshot

这是一个嵌套循环,内循环正在进行数据库调用。这将使用我当前的数据集进行2,800个数据库调用,这看起来非常缓慢和效率低下。

一定有更好的解决办法,但我真的想不出一个。我想选择所有的电影,并选择所有的截图,然后找到一些方法来迭代两个数组,同时保持它们之间的同步,如果这是正确的话。

在这种情况下,正确的/最优的做法是什么?

EN

回答 1

Software Engineering用户

发布于 2014-12-04 00:00:04

在发表了一些评论并再次阅读了这个问题之后,我意识到了一个核心问题--你有一个XY问题:

还有一个相关的表格,其中每行都是电影中的一个截图(包括字段'movie_id‘和'jpeg_data'),我确实看到了一个性能上的成功,是的;即使在我本地托管的网页上只有12张图片,我也看到了5秒的加载时间,因为它获取了图像。

web浏览器的目的是尽可能快地获取所有数据。在呈现页面时,它通常(并不总是)更愿意做大量的静态数据(如图像)的小提取,而不是一次大的获取。一个大的抓取-它必须等待一点,直到它可以开始呈现。

这可能是核心问题。不是循环上的迭代,而是必须遍历循环才能获得jpeg数据。

不要将图像存储在数据库中。将图像存储为web服务器可以作为静态文件访问的静态文件。将文件名或文件路径存储在数据库中。

试图将大型(而不是一致大小的)二进制文件从数据库中提取出来,并不是它所设计或擅长的--这正是文件系统所擅长的。

相关信息:

撇开这一点不说,你有两个结果集。您可以:

  • 使用数据库(如果它支持的话)将连接的信息(文件名)存储到一个列中。从电影M中选择M.id,M.moviename,group_concat(S.filename)加入M.id的S组(S.movieid = M.id)
  • 只需将所有数据作为一个连接的结构来获取(为什么首先获取两个结果集?)从电影M中选择M.id,M.moviename,S.filename加入S的截图(S.movieid = M.id)
  • 获取所有数据,并将其放入程序中的一个很好的结构中,并对其进行迭代。公共类Movie { int id;字符串名称;List文件;}
  • 迭代结果集,当您到达下一部电影时,备份。moviesCursor print movie.title中的电影为movie.director,screenShotCursor if != movie.id screenShotCursor.previous上的截图为"

其中一些可能受到语言和数据库选择的限制。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/264504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档