我理解Dataset API是一种迭代器,它不会将整个数据集加载到内存中,因此无法找到数据集的大小.我正在谈论存储在文本文件或tfRecord文件中的大型数据语料库.通常使用tf.data.TextLineDataset或类似的东西来读取这些文件.找到使用的数据集加载大小是微不足道的tf.data.Dataset.from_tensor_slices.
我问数据集大小的原因如下:假设我的数据集大小为1000个元素.批量大小= 50个元素.然后训练步骤/批次(假设1个纪元)= 20.在这20个步骤中,我想将我的学习率从0.1到0.01指数衰减为
tf.train.exponential_decay(
learning_rate = 0.1,
global_step = global_step,
decay_steps = 20,
decay_rate = 0.1,
staircase=False,
name=None
)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我有"和"想要设置decay_steps = number of steps/batches per epoch = num_elements/batch_size.仅当预先知道数据集中的元素数量时,才能计算此值.
另一个原因预先知道尺寸是将数据拆分为使用训练集和测试集tf.data.Dataset.take(),tf.data.Dataset.skip()方法.
PS:我不是在寻找蛮力方法,例如迭代整个数据集并更新计数器来计算元素数量或放置非常大的批量大小,然后查找结果数据集的大小等.
什么是增量构建numpy数组的最有效方法,例如一次一行,而不事先知道最终大小?
我的用例如下.我需要加载一个大文件(10-100M行),每行需要字符串处理,并应形成一行numpy数组.
将数据加载到临时Python列表并转换为数组是否更好?或者numpy中是否存在一些可以提高效率的现有机制?
我想知道是否有可能知道有多少行包含我的文件文本而不使用命令:
with open('test.txt') as f:
text = f.readlines()
size = len(text)
Run Code Online (Sandbox Code Playgroud)
我的文件非常庞大,所以很难使用这种方法......
我知道 skiprows 允许您传递包含要跳过的行索引的列表。但是,我有要保留的行的索引。
假设我的 cvs 文件在数百万行中看起来像这样:
A B
0 1 2
1 3 4
2 5 6
3 7 8
4 9 0
Run Code Online (Sandbox Code Playgroud)
我想加载的索引列表只有 2,3,所以
index_list = [2,3]
Run Code Online (Sandbox Code Playgroud)
skiprows 函数的输入是 [0,1,4]。但是,我只有 [2,3] 可用。
我正在尝试类似的东西:
pd.read_csv(path, skiprows = ~index_list)
Run Code Online (Sandbox Code Playgroud)
但没有运气..有什么建议吗?
谢谢,我感谢所有的帮助,
我有一个包含100k文本文件的文件夹.我想把超过20行的文件放在另一个文件夹中.我怎么在python中这样做?我使用了os.listdir,但当然没有足够的内存来将文件名加载到内存中.有没有办法一次获得100个文件名?
这是我的代码:
import os
import shutil
dir = '/somedir/'
def file_len(fname):
f = open(fname,'r')
for i, l in enumerate(f):
pass
f.close()
return i + 1
filenames = os.listdir(dir+'labels/')
i = 0
for filename in filenames:
flen = file_len(dir+'labels/'+filename)
print flen
if flen > 15:
i = i+1
shutil.copyfile(dir+'originals/'+filename[:-5], dir+'filteredOrigs/'+filename[:-5])
print i
Run Code Online (Sandbox Code Playgroud)
并输出:
Traceback (most recent call last):
File "filterimage.py", line 13, in <module>
filenames = os.listdir(dir+'labels/')
OSError: [Errno 12] Cannot allocate memory: '/somedir/'
Run Code Online (Sandbox Code Playgroud)
这是修改后的脚本:
import os
import shutil
import glob …Run Code Online (Sandbox Code Playgroud) 我在多个子文件夹中的.txt文件中有很多任务.我试图从这些文件夹,它们包含的文件以及文件中的文本行中随机选取总共10个任务.应删除或标记选定的行,以便在下次执行时不会选择它.这可能是一个太宽泛的问题,但我很欣赏任何意见或方向.
这是我到目前为止的代码:
#!/usr/bin/python
import random
with open('C:\\Tasks\\file.txt') as f:
lines = random.sample(f.readlines(),10)
print(lines)
Run Code Online (Sandbox Code Playgroud) 我很惊讶地知道这Python 3.5.2比慢得多Python 2.7.12.我写了一个简单的命令行命令来计算巨大的CSV文件中的行数.
$ cat huge.csv | python -c "import sys; print(sum(1 for _ in sys.stdin))"
101253515
# it took 15 seconds
$ cat huge.csv | python3 -c "import sys; print(sum(1 for _ in sys.stdin))"
101253515
# it took 66 seconds
Run Code Online (Sandbox Code Playgroud)
Python 2.7.12耗时15秒,Python 3.5.2耗时66秒.我预计差异可能会发生,但为什么会如此巨大呢?Python 3中有哪些新功能使得这类任务变得更慢?有没有更快的方法来计算Python 3中的行数?
我的CPU是Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz.
大小huge.csv为18.1 Gb,包含101253515行.
问这个问题,我不需要不惜一切代价找到一个大文件的行数.我刚刚编写了一个特殊情况,其中Python 3要慢得多.实际上,我正在使用Python 3开发一个处理大型CSV文件的脚本,有些操作不会假设使用csv库.我知道,我可以用Python 2编写脚本,这对速度来说是可以接受的.但是我想知道一种在Python 3中编写类似脚本的方法.这就是为什么我感兴趣的是在我的示例中使Python 3变慢的原因以及如何通过"诚实"的python方法来改进它.
我的 CSV 文件大小为 70 GB。我想在惰性模式下加载 DF 并计算行数。最好的方法是什么?
据我所知,根据文档,在惰性模式下没有像 shape 这样的函数。我发现这个答案提供了一个不基于 Polars 的解决方案,但我想知道是否也可以在 Polars 中做到这一点。
我正在从一些类似于以下内容的文本文件中解析日期/时间/测量信息:
[Sun Jul 15 09:05:56.724 2018] *000129.32347
[Sun Jul 15 09:05:57.722 2018] *000129.32352
[Sun Jul 15 09:05:58.721 2018] *000129.32342
[Sun Jul 15 09:05:59.719 2018] *000129.32338
[Sun Jul 15 09:06:00.733 2018] *000129.32338
[Sun Jul 15 09:06:01.732 2018] *000129.32352
Run Code Online (Sandbox Code Playgroud)
结果进入输出文件,如下所示:
07-15-2018 09:05:56.724, 29.32347
07-15-2018 09:05:57.722, 29.32352
07-15-2018 09:05:58.721, 29.32342
07-15-2018 09:05:59.719, 29.32338
07-15-2018 09:06:00.733, 29.32338
07-15-2018 09:06:01.732, 29.32352
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码如下所示:
import os
import datetime
with open('dq_barorun_20180715_calibtest.log', 'r') as fh, open('output.txt' , 'w') as fh2:
for line in fh:
line = line.split()
monthalpha = …Run Code Online (Sandbox Code Playgroud) 是否有一种方法可以在不实际将整个文件加载到内存中的情况下(在 Python 中)查找 csv 文件中的行数?
我希望它可以有一些特殊的优化功能。我现在所能想象的就是一行一行地阅读它并计算行数,但这有点扼杀了其中所有可能的意义,因为我只需要行数,而不是实际内容。
python ×10
python-3.x ×2
arrays ×1
csv ×1
dataframe ×1
file ×1
file-io ×1
numpy ×1
optimization ×1
pandas ×1
performance ×1
python-2.7 ×1
tensorflow ×1
text ×1