2

是否有可能实现populate它使用insert而不是insert1?对于大型数据集,我收到服务器超时错误,因为使用insert1需要数小时来填充表。这是我的目的:

def make(self, key):
        
   keys = Session.fetch('KEY') # get the primary key(s) from session .fetch('KEYS') for multiple
        

   filename = 'data/AJ0{mouse_id}_{session_id}'.format(**key) # get the filename of the session you are interested in
   mat = spio.loadmat(filename, squeeze_me=True,struct_as_record=False) #load the data in .mat format
   data = mat[list(mat)[-1]] # unpack the dictionaries to select the specific data

   activity_arr = data.deResp
   n_trials, n_neuron = activity_arr.shape
        
   for neuro_id in range(0, n_neuron):
       for trial_id in range(0, n_trials):
           key['neuro_id'] = neuro_id
           key['activity'] = activity_arr[trial_id, neuro_id]
           self.insert1(Key, skip_duplicates=True)

我想要的是这样的

for neuro_id in range(0, n_neuro):
    key['neuro_id'] = np.asarray([neuro_id]*n_trials)
    key['activity'] = activity_arr[0:n_trials,neuro_id]
    self.insert(key, skip_duplicates=True)

有点插入字典列表并能够调用填充方法。有什么建议么?

过去,我实现了下面的 make 函数,但是使用这个函数我无法调用 populate 。

def make(self):
        
    activity_arr = data.deResp
    n_trials, n_neuron = activity_arr.shape
        
    for neuro_id in range(0, n_neuron):
        trial_ids = np.arange(0,n_trials)
        mouse_id = np.asarray([self.mouse_id]*n_trials)
        neuro_ids = np.asarray([neuro_id]*n_trials)
        sess = np.asarray([self.session_id]*n_trials)
        acts=activity_arr[0:n_trials,neuro_id]
        arr=np.vstack((mouse_id,sess,trial_ids,neuro_ids,acts)).T
        self.insert(list(arr), skip_duplicates=True)
4

1 回答 1

3

在这种情况下,以不同的方式实现填充可能无法解决获取服务器超时的问题。当您调用 populate 时,它​​会从管道中的上游提取密钥并在它们上调用您的 make 函数,每个 make 函数都在一个 mysql 事务中处理,如果您的 make 函数花费太长时间,该事务可能会超时。

有几种方法可以解决这个问题:

1:增加make函数中的连接超时。这是一个创可贴修复程序,至少可以让您的表格充满活力。

前任:

import datajoint as dj
conn = dj.conn()
conn.query("SET SESSION wait_timeout=10").fetchall()
print(conn.query("SHOW VARIABLES LIKE 'wait_timeout'").fetchall())

超时以秒为单位,打印语句将显示它是否正确更改。我建议在调用填充之前更改它,然后在调用填充后将其更改回原始超时。

2:ping服务器刷新超时。这对您的情况可能没有帮助,因为我怀疑在这种情况下是 spio.loadmat() 函数需要很长时间。

使用此代码在需要很长时间执行的代码之间对服务器执行 ping 操作:

import datajoint as dj
conn = dj.conn()
conn.ping()

3:优化您的代码以提高性能,使其不会超时。在这种情况下,我认为您无法以有意义的方式执行此操作,因为当您调用 spio.loadmat() 加载 matlab 二进制文件时,可能会产生所有计算开销。

关于填充方法的说明:

当您使用suppress_errors = true标志运行它时,该函数不会出错,而是移至下一个键并将错误和与其关联的键附加到函数返回的列表中。在处理需要很长时间的填充时,此行为可能会对您有所帮助,因为您可以稍后再返回并仅处理未能填充的键。

于 2021-09-13T22:23:57.893 回答