Rails应用中ActiveRecord的批量处理反向移植指南

需积分: 5 0 下载量 155 浏览量 更新于2024-11-25 收藏 6KB ZIP 举报
资源摘要信息:"in_batches:ActiveRecord的反向移植" 知识点: 1. ActiveRecord::Relation#in_batches简介 ActiveRecord是Ruby on Rails框架中的对象关系映射(ORM)系统,它提供了一种机制,允许Ruby程序通过ActiveRecord模型与数据库中的表进行交互。在Rails 4中,引入了ActiveRecord::Relation#in_batches方法,这是一个非常实用的工具,它允许开发者以批处理的方式对数据库记录进行操作,这样可以有效避免因一次性加载大量数据而导致的内存溢出或性能问题。 2. 反向移植概念 反向移植是指将一个新版本软件的特性回溯并应用到旧版本软件中的过程。在这个例子中,ActiveRecord::Relation#in_batches原本是Rails 4的特性,通过gem "activerecord-in_batches"的引入,可以将这一特性移植到早于Rails 4的Rails应用程序中,从而让旧版本的Rails应用程序也能够利用这一高效处理大量数据的机制。 3. gem的安装与配置 从给出的描述中,要安装这个gem,开发者需要将其添加到项目的Gemfile中,并指定仓库地址。这里的仓库地址是git://***/siadat/in_batches.git,这意味着gem的源代码托管在GitHub上。添加完毕后,执行bundle install命令来安装gem。 4. 使用示例 安装完毕后,开发者可以按照示例中的方式使用in_batches方法。具体方法如下: - Person.in_batches.each_record { |record| record.party_all_night! } 这行代码将会把Person模型的记录分成批次,每批次执行一次block中的代码,这里的block代码是对每个记录调用party_all_night!方法。 - Person.in_batches.update_all(awesome: true) 这行代码会更新所有批次的记录,将字段awesome设置为true,这是一个批量更新操作,它不会加载任何记录到内存中,直接在数据库层面完成更新。 - Person.in_batches.delete_all 这行代码会删除所有批次的Person记录,同样是在数据库层面执行,不会将记录加载到内存中。 - Person.in_batches(of: 10_000).map do |relation| relation.delete_all sleep 10 # Throt end 这个示例展示了如何自定义批次的大小,并对每个批次执行更复杂的操作,例如这里删除了每个批次的记录,并在每次删除后暂停10秒。这可以帮助控制对数据库的压力,避免一次性操作对数据库造成过大冲击。 5. 标签含义 - rails: 指的是Ruby on Rails框架,这是使用Ruby语言编写的开源全栈Web应用框架。 - activerecord: 指的是Rails框架中的ORM组件,它负责处理程序与数据库之间的数据映射。 - batch-job: 在这里指的是通过批处理执行的任务或作业,通常用于处理大量数据以提高效率。 - Ruby: 指的是编程语言Ruby,Rails框架就是用Ruby语言编写的。 6. 文件名称列表 压缩包子文件的文件名称列表中的 "in_batches-master" 指的是一个版本控制系统(如Git)的主分支的文件夹,这表明该gem的相关文件可能存储在GitHub的主分支中。通常,开发者会基于这样的master分支来构建他们的项目。 根据给出的信息,可以得知ActiveRecord::Relation#in_batches是一个强大的功能,它能够提升Rails应用程序处理大数据集的性能。通过将其移植到旧版本的Rails应用中,开发者可以享受这一优势,而不需要升级到最新的Rails版本。在使用时需要注意对数据进行有效分批,并考虑到可能对数据库性能的影响,例如使用sleep函数来控制操作速度,防止对数据库造成过大压力。

下面这段代码的作用是什么def setup_model(self): self.enumerate_unique_labels_and_targets() self.model = CasSeqGCN(self.args, self.number_of_features + self.args.number_of_hand_features, self.number_of_nodes) #给当前类中模型主体进行初始化,初始化为上面的模型 def create_batches(self): N = len(self.graph_paths) train_start, valid_start, test_start = \ 0, int(N * self.args.train_ratio), int(N * (self.args.train_ratio + self.args.valid_ratio)) train_graph_paths = self.graph_paths[0:valid_start] valid_graph_paths = self.graph_paths[valid_start:test_start] test_graph_paths = self.graph_paths[test_start: N] self.train_batches, self.valid_batches, self.test_batches = [], [], [] for i in range(0, len(train_graph_paths), self.args.batch_size): self.train_batches.append(train_graph_paths[i:i+self.args.batch_size]) for j in range(0, len(valid_graph_paths), self.args.batch_size): self.valid_batches.append(valid_graph_paths[j:j+self.args.batch_size]) for k in range(0, len(test_graph_paths), self.args.batch_size): self.test_batches.append(test_graph_paths[k:k+self.args.batch_size]) def create_data_dictionary(self, edges, features): """ creating a data dictionary :param target: target vector :param edges: edge list tensor :param features: feature tensor :return: """ to_pass_forward = dict() to_pass_forward["edges"] = edges to_pass_forward["features"] = features return to_pass_forward def create_target(self, data): """ Target createn based on data dicionary. :param data: Data dictionary. :return: Target size """ return torch.tensor([data['activated_size']])

2023-05-18 上传