我有数十万个数据文本文件要读取。到目前为止,每次运行代码时,我都会从文本文件中导入数据。也许简单的解决方案是将数据重新格式化为更快读取的文件。 无论如何,现在我拥有的每个文本文件如下:
User: unknown
Title : OE1_CHANNEL1_20181204_103805_01
Sample data
Wavelength OE1_CHANNEL1
185.000000 27.291955
186.000000 27.000877
187.000000 25.792290
188.000000 25.205620
189.000000 24.711882
.
.
.
我读取和导入txt文件的代码是:
# IMPORT DATA
path = 'T2'
if len(sys.argv) == 2:
path = sys.argv[1]
files = os.listdir(path)
trans_import = []
for index, item in enumerate(files):
trans_import.append(np.loadtxt(path+'/'+files[1], dtype=float, skiprows=4, usecols=(0,1)))
结果数组在变量浏览器中的外观为: {ndarray} = [[185。 27.291955] \ n [186。 27.000877] \ n ...]
我想知道,如何才能加快这一步?到目前为止,导入〜4k文本文件需要花费一些时间。每个文本文件(频谱)中有841行。通过此代码获得的输出为841 * 2 =1682。显然,它将\ n视为一行...
答案 0 :(得分:1)
如果有一个大文件而不是许多小文件,则可能会更快。通常这更有效。另外,您可能会从直接保存numpy
数组并加载该.npy
文件而不是读取大文本文件中而获得加速。不过我不确定最后一部分。与往常一样,当需要时间时,我会尝试这两个选项,然后评估性能提高。
如果由于某种原因您确实不能只拥有一个大文本文件/ .npy
文件,则还可以通过使用multiprocessing
来让多个工作人员阅读文件在同一时间。然后,您可以在最后将矩阵连接在一起。
这不是您的主要问题,但由于这似乎是一个问题-您可以重写文本文件以使它们没有多余的换行符,但我认为np.loadtxt
不能忽略它们。不过,如果您愿意使用pandas
,那么将pandas.read_csv
与skip_blank_lines=True
一起使用将为您解决。要从numpy.ndarray
获取pandas.DataFrame
,只需执行dataframe.values
。
答案 1 :(得分:0)
让我们使用pandas.read_csv(具有C速度)而不是numpy.loadtxt。这是一个非常有帮助的帖子: http://akuederle.com/stop-using-numpy-loadtxt